• libtiff库使用


    此文章为了记录我在使用libtiff库中的一些问题而写,将不断补充。

    libtiff库是读取和写入tiff文件最主要的一个开源库,但文档写的实在不敢恭维。相对资料也是异常稀少。

    libtiff库的安装

    libtiff库的最新的最新版本可以从http://www.libtiff.org/下载,即可以编译源码也可以采用预先编译好的二进制文件。

    本人推荐使用预编译版本,自己编译容易缺少依赖库,同时也可能出现一些莫名其妙的问题。

    tiff文件的读写函数:

    1 //获取strip大小
    2 tsize_t TIFFStripSize(TIFF *tif);
    3 //读取strip数据,buf缓冲区可由TIFFStripSize计算,size取-1代表读取整个strip
    7 tsize_t TIFFReadEncodedStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size);

    将多色tiff文件分割

     1     uint32 imageWidth, imageLength, TileWidth, TileLength, imageRowsPerStrip ;
     2     uint16 imageCompression, imageSamplePerPixel ;
     3     uint16 imagePlanarConfig, imagePhotoMetric, ResolutUnit, Orientation ;
     4     uint16 bps ;
     5     float X_Resolut, Y_Resolut ;
     6 
     7     TIFF *tif_r, *tif_w ;  
     8     unsigned char *buf;
     9     tstrip_t strip ;
    10 
    11     tif_r = TIFFOpen("image_4plane.tif", "r");
    12     if (!tif_r)
    13     {
    14         error_handler("Open Tiff File Error!");
    15         return -1;
    16     }
    17     /* 讀取 TIFF 標籤 */
    18     TIFFGetField(tif_r, TIFFTAG_IMAGEWIDTH, &imageWidth);
    19     TIFFGetField(tif_r, TIFFTAG_IMAGELENGTH, &imageLength);
    20 
    21     TIFFGetField(tif_r, TIFFTAG_BITSPERSAMPLE, &bps);
    22     TIFFGetField(tif_r, TIFFTAG_COMPRESSION, &imageCompression);
    23     TIFFGetField(tif_r, TIFFTAG_PHOTOMETRIC, &imagePhotoMetric);
    24 
    25     TIFFGetField(tif_r, TIFFTAG_SAMPLESPERPIXEL, &imageSamplePerPixel);
    26     TIFFGetField(tif_r, TIFFTAG_ROWSPERSTRIP, &imageRowsPerStrip);
    27     if (imageRowsPerStrip != 1)
    28     {
    29         error_handler("Rows Each Strip Is Not 1!");
    30         return -1;
    31     }
    32 
    33     TIFFGetField(tif_r, TIFFTAG_XRESOLUTION, &X_Resolut);
    34     TIFFGetField(tif_r, TIFFTAG_YRESOLUTION, &Y_Resolut);
    35     TIFFGetField(tif_r, TIFFTAG_RESOLUTIONUNIT, &ResolutUnit);
    36 
    37     TIFFGetField(tif_r, TIFFTAG_PLANARCONFIG, &imagePlanarConfig);
    38     TIFFGetField(tif_r, TIFFTAG_ORIENTATION, &Orientation);
    39 
    40     int stripsize = TIFFStripSize(tif_r);
    41     buf = (unsigned char *) malloc(stripsize) ;
    42     if (!buf)
    43     {
    44         error_handler("Allocate Buffer Failed!");
    45     }
    46     Mat ht_img(Size(imageWidth, imageLength),CV_8UC1,Scalar::all(0));
    47     const int color[7] = {0,1,2,3,4,5,6};
    48     unsigned char * pRow; 
    49             
    50             
    51     for (strip = 0; strip < TIFFNumberOfStrips(tif_r); strip++)
    52     {
    53         TIFFReadEncodedStrip(tif_r, strip, buf, (tsize_t) -1);
    54         pRow = ht_img.ptr(strip);
    55         for (int i_pixel = 0; i_pixel < imageWidth; i_pixel++)
    56         {
    57             pRow[i_pixel] = buf[i_pixel*imageSamplePerPixel + color[6]];
    58         }
    59     }
    60     imwrite("strip_out.tiff", ht_img);
    61     
    62     free(buf);
    63     TIFFClose(tif_r);
    64     printf("Done!
    ");

     

    参考文献:

    1. libtiff库的使用

    http://darkranger.no-ip.org/archives/v5/document/develop/libtiff_tutorial.htm

    2. 关于如何判断一个tiff文件是tile或者是strip的说明

    http://www.asmail.be/msg0054551721.html

  • 相关阅读:
    mac 10.15.7 修改PATH
    oc 属性类型一般用法
    ubuntu解压zip文件名乱码
    telnet 退出
    docker 根据容器创建镜像
    mac android adb device 没有显示设备
    Yii2 查看所有的别名 alias
    Yii2 App Advanced 添加 .gitignore
    ubuntu 18.04 搜狗突然就提示乱码
    An error occured while deploying the file. This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to
  • 原文地址:https://www.cnblogs.com/hujianhua/p/3261013.html
Copyright © 2020-2023  润新知