使用LibTiff处理TIFF文件
2012-06-04 15:58
633 查看
一 TIFF简介
IFF是Tagged Image File Format(标记图像文件格式)的缩写,这是现阶段印刷行业使用最广泛的文件格式,文件扩展名为tif或tiff.TIFF是一种比较灵活的图像格式,该格式支持单色,8,16,256色、24位真彩色、32位色、48位色等多种色彩位,同时支持rgb、cmyk以及ycbcr等多种色彩模式,支持多平台。tiff文件可以是不压缩的,文件体积较大,也可以是压缩的,支持raw、rle、lzw、jpeg、ccitt3组和4组等多种压缩方式
TIFF规范第一版本由Aldus公司在1986年发布,到现在已经发布到第六版。
我们这里只讨论使用libtiff对tif图进行编程,所以关于TIF的详细介绍请见Tiff Revision 6.0。
参考:/article/11031854.html
编译:
1 可以进入CMD环境直接运行命令行 "C:/libtiff/libtiff>
nmake /f makefile.vc all" ,假设代码放在C:/libtiff/libtiff> 下面。
读tiff文件
TIFF* tiff = TIFFOpen("left1.tif","r");
//TIFF* tiff = TIFFOpen("test.tif","r");
int nTotalFrame = TIFFNumberOfDirectories(tiff);
TIFFSetDirectory(tiff,0);
char *dtitle;
TIFFGetField(tiff,TIFFTAG_PAGENAME,&dtitle);
int width,height;
TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width); //得到宽度
TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height);//得到高度
uint16 bitspersample=1;
uint16 samplesperpixel=3;
TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitspersample);
uint16 bitsperpixel = bitspersample * samplesperpixel;
//算出每个像素占多少bit,24位图,值为24
DWORD dwBytePerLine = (width*bitsperpixel)/32 *4;
//由上面几个参数算出图像每行所占字节(BYTE)数。
//为存放数据分配内存空间
ArrayJS buffJPG;
for (int y = 0; y < height; y++)
{
BYTE* buffTIF =(BYTE*)(malloc(width*4));
int flag = TIFFReadScanline(tiff, buffTIF, y, 0);
for (int i=0;i<width;i++)
{
buffJPG.push_back(buffTIF[4*i]);
buffJPG.push_back(buffTIF[4*i+1]);
buffJPG.push_back(buffTIF[4*i+2]);
}
free(buffTIF);
}
IFF是Tagged Image File Format(标记图像文件格式)的缩写,这是现阶段印刷行业使用最广泛的文件格式,文件扩展名为tif或tiff.TIFF是一种比较灵活的图像格式,该格式支持单色,8,16,256色、24位真彩色、32位色、48位色等多种色彩位,同时支持rgb、cmyk以及ycbcr等多种色彩模式,支持多平台。tiff文件可以是不压缩的,文件体积较大,也可以是压缩的,支持raw、rle、lzw、jpeg、ccitt3组和4组等多种压缩方式
TIFF规范第一版本由Aldus公司在1986年发布,到现在已经发布到第六版。
我们这里只讨论使用libtiff对tif图进行编程,所以关于TIF的详细介绍请见Tiff Revision 6.0。
参考:/article/11031854.html
编译:
1 可以进入CMD环境直接运行命令行 "C:/libtiff/libtiff>
nmake /f makefile.vc all" ,假设代码放在C:/libtiff/libtiff> 下面。
读tiff文件
TIFF* tiff = TIFFOpen("left1.tif","r");
//TIFF* tiff = TIFFOpen("test.tif","r");
int nTotalFrame = TIFFNumberOfDirectories(tiff);
TIFFSetDirectory(tiff,0);
char *dtitle;
TIFFGetField(tiff,TIFFTAG_PAGENAME,&dtitle);
int width,height;
TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width); //得到宽度
TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height);//得到高度
uint16 bitspersample=1;
uint16 samplesperpixel=3;
TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitspersample);
uint16 bitsperpixel = bitspersample * samplesperpixel;
//算出每个像素占多少bit,24位图,值为24
DWORD dwBytePerLine = (width*bitsperpixel)/32 *4;
//由上面几个参数算出图像每行所占字节(BYTE)数。
//为存放数据分配内存空间
ArrayJS buffJPG;
for (int y = 0; y < height; y++)
{
BYTE* buffTIF =(BYTE*)(malloc(width*4));
int flag = TIFFReadScanline(tiff, buffTIF, y, 0);
for (int i=0;i<width;i++)
{
buffJPG.push_back(buffTIF[4*i]);
buffJPG.push_back(buffTIF[4*i+1]);
buffJPG.push_back(buffTIF[4*i+2]);
}
free(buffTIF);
}
相关文章推荐
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件(转载)
- VC下使用LibTiff处理TIFF文件
- JAVA 使用springMVC 上传多张图片或文件,并对图片进行按比例缩放处理
- asp.net使用一般处理程序实现文件下载
- VC++中使用内存映射文件处理大文件
- python处理大数据文件,set、enumerate使用,python传参,获取文件路径
- 使用Django来处理对于静态文件的请求
- xml布局文件里直接使用背景图导致爆内存的情况处理
- 使用getJSON方法读取json文件数据并处理
- 关于使用jxl导出excel文件(2003) 单个sheet 65536 超出范围的 情况处理
- MapReduce-定制Partitioner-使用NLineInputFormat处理大文件-求文件奇偶数行之和
- 删除图片时,报错“正由另一进程使用,因此该进程无法访问此文件”的处理方式
- 【FileUtils】File对文件与目录的处理&FileUtis工具的使用
- VC++中使用内存映射文件处理大文件
- 使用T-SQL进行数据库备份并检查该备份文件是否存在且作出相应处理
- 使用KTM(内核事务管理器)进行文件事务处理
- 编码的问题--编码有三种(页面编码,文件格式的编码,后台处理所使用的编码)