• LIBTIFF库的使用心得


    VC2010使用libtiff库的环境配置:

    头文件:tiff.h、tiffconf.h、tiffio.h、tiffvers.h

    库文件:libtiff.lib、libtiff.dll

    以上文件放到当前工作路径即可。

    源码中需要写入:

    1 #include "tiffio.h"
    2 #pragma comment( lib, ".\lib\libtiff.lib")

    接下来就可以使用该库的API:

    TIFF* TIFFOpen(const char*, const char*);//写入或读取tif文件。

    该函数有两个参数。第一个参数用于输入图片文件的名称(绝度路径或相对路径)

    第二个参数用于表示对图片文件的模式。"r"代表读。"w"代表写,"a"代表追加。返回一个tiff指针,以后所有的操作都可以通过该指针进行。

    void TIFFClose(TIFF* tif);//用于释放图片在内存中的资源。Tif即为图片在库中的tif指针。

    如:

     1 TIFF*tiff_r = TIFFOpen(“temp.tif”,”r”);
     2 
     3 If(tiff_r)
     4 
     5 {
     6 
     7     …..
     8 
     9 }
    10 
    11 TIFFClose(tiff_r);
    int TIFFGetField(TIFF* tif, uint32 tag, ...);//用于获取tif图片的属性。

    其属性主要包括如下(仅写出比较重要的几个)

     1 TIFFTAG_BITSPERSAMPLE  每个像素点中每个通道的颜色深度(即一个通道占几个字节)
     2 
     3 TIFFTAG_COLORMAP 色图:调色板图像的RGB映射
     4 
     5 TIFFTAG_COMPRESSION  压缩标准:COMPRESSION_NONE、COMPRESSION_PACKBITS 、COMPRESSION_LZW(一部分)
     6 
     7 TIFFTAG_IMAGELENGTH1 uint32* 图像长度 
     8 TIFFTAG_IMAGEWIDTH 1 uint32* 图像宽度
     9 
    10 TIFFTAG_ROWSPERSTRIP1 uint32* 每个条的行数
    11 TIFFTAG_XRESOLUTION 1 float* X分辨率|水平解析度
    12 
    13 TIFFTAG_YRESOLUTION1 float*? Y分辨率|竖直解析度
    int TIFFSetField(TIFF*, uint32, ...);//用于设置tif图片的属性。

    主要设置如下:

     1 TIFFSetField(image,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);//设置色彩模式 
     2 
     3 TIFFSetField(tif_r,TIFFTAG_IMAGEWIDTH,1024);//设置图像宽度。            TIFFSetField (tif_r,TIFFTAG_IMAGELENGTH, 2048);//设置图像高度
     4 
     5 TIFFSetField (tif_r,TIFFTAG_BITSPERSAMPLE, 16);//设置图像每通道的位数
     6 
     7 TIFFSetField (tif_r,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);//设置图像类型
     8 
     9 TIFFSetField (tif_r,TIFFTAG_SAMPLESPERPIXEL,3);//设置图像的通道数
    10 
    11 TIFFSetField (tif_r,TIFFTAG_XRESOLUTION, 72.000000);//x分辨率
    12 
    13 TIFFSetField (tif_r,TIFFTAG_YRESOLUTION, 72.000000);//y分别率
    14 
    15 TIFFSetField(image,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); // 设置配置
    16 
    17 TIFFSetField(image,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); // 设置Planar配置.
    int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);//按行向图像写入数据,tif为图像指针,buf为需要写入的数据。row为需要写入图像的第几行,sample默认为0;

    通过以上设置要写入tif图片的属性可以获取到写入该图片所需要的长度。

    1 DWORDdwLeng = width * 3 *height;//在内存中存放该图片所需要的长度。
    2 
    3 Uint16*pImageData = new Uint16[dwLeng];//为存放数据分配内存空间。

    如果将保存有tif图片的data数据信息生成一幅.tif图片,则步骤如下:

     1 Memset(pImageData,0,dwLeng*sizeof(Uint16);
     2 
     3 Memcpy(pImageData,data,width*height*3*sizeof(Uint16));
     4 
     5 for(intiheight = 0;iheight < height;iheight++)
     6 
     7 {
     8 
     9     Uint16* prow = new Uint16[width*3];
    10 
    11     Memcpy(prow,pImageData+(byte*)iheight*width*3*sizeof(Uint16),width*3*sizeof(Uint16);
    12 
    13     TIFFWriteScanline(tif,prow,iheight,0);
    14 
    15     Delete [] prow;
    16 
    17     Prow = NULL;
    18 
    19 }

    TIFFWriteEncodedStrip函数的使用。

    问题分析:该函数的第三个参数是一个tdata_t类型的数据,也就是要写入tif的像素数据。
    由于可操作性太低,不易控制不推荐使用,推荐使用以下函数TIFFWriteScanline。

  • 相关阅读:
    JZ36 两个链表的第一个公共结点
    程序员的表达能力
    Git学习(2)-使用Git 代码将本地文件提交到 GitHub
    初识模块
    三元表达式、递归、匿名函数
    CSRF
    XSS前置课程--同源策略
    XSS
    SQL注入基础入门
    Linux下ettercap的安装,make安装软件步骤
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13672531.html
Copyright © 2020-2023  润新知