VC下使用LibTiff处理TIFF文件Word文件下载.docx
- 文档编号:16712379
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:17
- 大小:19.72KB
VC下使用LibTiff处理TIFF文件Word文件下载.docx
《VC下使用LibTiff处理TIFF文件Word文件下载.docx》由会员分享,可在线阅读,更多相关《VC下使用LibTiff处理TIFF文件Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
mso-style-qformat:
yes;
mso-style-parent:
margin:
0cm;
margin-bottom:
.0001pt;
text-align:
justify;
text-justify:
inter-ideograph;
mso-pagination:
none;
font-size:
10.5pt;
mso-bidi-font-size:
12.0pt;
font-family:
TimesNewRoman"
"
serif"
mso-fareast-font-family:
mso-font-kerning:
1.0pt;
.MsoChpDefault
{mso-style-type:
export-only;
mso-default-props:
10.0pt;
mso-ansi-font-size:
mso-ascii-font-family:
mso-hansi-font-family:
0pt;
/*PageDefinitions*/
@page
{mso-page-border-surround-header:
mso-page-border-surround-footer:
@pageSection1
{size:
595.3pt841.9pt;
72.0pt90.0pt72.0pt90.0pt;
mso-header-margin:
42.55pt;
mso-footer-margin:
49.6pt;
mso-paper-source:
layout-grid:
15.6pt;
div.Section1
{page:
Section1;
-->
table.MsoNormalTable
{mso-style-name:
普通表格;
mso-tstyle-rowband-size:
mso-tstyle-colband-size:
mso-style-noshow:
mso-style-priority:
99;
mso-padding-alt:
0cm5.4pt0cm5.4pt;
mso-para-margin:
mso-para-margin-bottom:
widow-orphan;
11.0pt;
Calibri"
sans-serif"
Calibri;
mso-ascii-theme-font:
minor-latin;
mso-fareast-theme-font:
minor-fareast;
mso-hansi-theme-font:
mso-bidi-font-family:
mso-bidi-theme-font:
minor-bidi;
}VC下使用LibTiff处理TIFF文件
一TIFF简介
IFF是TaggedImageFileFormat(标记图像文件格式)的缩写,这是现阶段印刷行业使用最广泛的文件格式,文件扩展名为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
Revision6.0。
下载网址:
阅读本文章之前,要求读者对BMP位图有一定的了解。
二
libtiff是在UNIX下用来读写TIFF文件的一个工具软件集合,包括关于TIFF的文档,lib文件,还提供了一些小工具,比如把TIFF转成PDF或传真等文件格式,是完全开放源码的。
libtiff详细介绍见:
http:
//www.libtiff.org和http:
//www.remotesensing.org/libtiff/
我们可下载完整的Libtiff,现在最新版本是3.7.2,下载网站ftp.remotesensing.org或
http:
//dl.maptools.org/dl/libtiff/。
三
解压后,在VC++环境下编译libtiff
有几种办法,简单举两种:
1可以进入CMD环境直接运行命令行
C:
\libtiff\libtiff&
gt;
nmake/fmakefile.vcall"
假设代码放在C:
下面。
2如果想利用VC的IDE环境,可以新建立一个生成dll的工程,把刚才下载的.h和.cpp文件导进来,然后在在"
project-&
Settings-&
C/C++"
在"
Category"
里选"
PrecompiledHeaders"
下面有4个单选,缺省选第四个"
使用stdafx.h"
这里改一下,选中第
一个:
Not
usingprecompiledheaders"
.然后编译就可以了。
新建一个MFC工程,把生成的libtiff.lib和libtiff.dll复制过来,并进行如下设置:
在"
Preprocessor"
,在"
Additionalinclude
directories:
里,把libtiff的相对路径或绝对路径写进去,比如"
..\libtiff"
四使用libtiff读出Tiff文件并显示出来
TIFF*tiff=TIFFOpen(szFileName,
r"
);
//打开Tiff文件,得到指针,以后所有的操作都通过指针进行。
intnTotalFrame=
TIFFNumberOfDirectories(tiff);
//一个TIFF文件可以放多幅图,每幅图我们在这里称作一帧,上面这个函数可以得出总帧数。
//为了便于理解,假定所有图都是真彩24位。
TIFFSetDirectory(tiff,0);
//我们打开第一幅图,也就是第0帧,如果是第1帧,第二个参数写1,由此类推。
因为Windows下图像基本
//操作都是以BMP格式进行,我们读出该帧并转成BMP格式。
char*dtitle;
TIFFGetField(tiff,TIFFTAG_PAGENAME,&
amp;
dtitle);
//得到该帧的名字,存放在dtitle中。
intwidth,height;
TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH,
&
width);
//得到宽度
TIFFGetField(tiff,TIFFTAG_IMAGELENGTH,
height);
//得到高度
floatresolution=max(xres,yres);
uint16bitspersample=1;
uint16samplesperpixel=1;
TIFFGetField(m_tif,
TIFFTAG_SAMPLESPERPIXEL,&
samplesperpixel);
//每个像素占多少机器字,24位图samplesperpixel应该等于3。
TIFFGetField(m_tif,TIFFTAG_BITSPERSAMPLE,
bitspersample);
//每一个机器字长,这里应为8。
uint16bitsperpixel=bitspersample*
samplesperpixel;
//算出每个像素占多少bit,24位图,值为24
DWORDdwBytePerLine=
(width*bitsperpixel+31)/32*4;
//由上面几个参数算出图像每行所占字节(BYTE)数。
DWORDdwLeng=height*dwBytePerLine;
//在内存里存放这帧图像数据所需要的长度
LPBYTEpData=newBYTE[dwLeng];
//为存放数据分配内存空间
uint32*raster;
uint32*row;
raster=(uint32*)_TIFFmalloc(width*
height*sizeof(uint32));
TIFFReadRGBAImage(tiff,width,height,
raster,1);
//以上几行读出该帧数据,保存到raster中。
row=&
raster[0];
bits2=pData;
for(y=0;
y&
lt;
height;
y++)
{
bits=bits2;
for(x=0;
x&
width;
x++)
{
*bits++=(BYTE)TIFFGetB(row[x]);
*bits++=(BYTE)TIFFGetG(row[x]);
*bits++=(BYTE)TIFFGetR(row[x]);
}
row+=width;
bits2+=dwBytePerLine;
_TIFFfree(raster);
//因为Tif的数据存放顺序和Windows下的BMP相反,上面这几句进行转换。
//转换结束后,数据存在pData里,释放raster所用内存。
根据上面得到的数据,组成一个新BMP位图:
LPBITMAPINFOpInfo=newBITMAPINFO;
pInfo-&
bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth=width;
bmiHeader.biHeight=width;
bmiHeader.biCompression=BI_RGB;
bmiHeader.biClrUsed=0;
bmiHeader.biClrImportant=0;
bmiHeader.biPlanes=1;
bmiHeader.biBitCount=24;
bmiHeader.biSizeImage=dwLeng;
floatxres,yres;
uint16res_unit;
//解析度单位:
如是英寸,厘米
TIFFGetFieldDefaulted(tiff,
TIFFTAG_RESOLUTIONUNIT,&
res_unit);
if(TIFFGetField(tiff,TIFFTAG_XRESOLUTION,
xres)==0)
m_pInfo-&
bmiHeader.biXPelsPerMeter=0;
else
if(res_unit==2)//英寸
bmiHeader.biXPelsPerMeter=xres*10000/254;
elseif(res_unit==3)//厘米
bmiHeader.biXPelsPerMeter=xres*100;
//得到该帧TIFF横向解析度,并计算出m_pInfo-&
bmiHeader.biXPelsPerMeter
if(TIFFGetField(tiff,TIFFTAG_YRESOLUTION,
yres)==0)
bmiHeader.biYPelsPerMeter=0;
bmiHeader.biYPelsPerMeter=yres*10000/254;
bmiHeader.biYPelsPerMeter=yres*100;
//得到该帧TIFF纵向解析度,并计算出m_pInfo-&
bmiHeader.biYPelsPerMeter
BITMAPFILEHEADERbmheader;
bmheader.bfType=0x4d42;
bmheader.bfSize=0;
bmheader.bfReserved1=0;
bmheader.bfReserved2=0;
bmheader.bfOffBits=54;
//这几句是生成bmp文件的头结构
CFilebmp;
bmp.Open("
c:
\\test.bmp"
CFile:
:
modeCreate|CFile:
modeWrite);
bmp.Write(&
bmheader,sizeof(BITMAPFILEHEADER));
(pInfo-&
bmiHeader),sizeof(BITMAPINFOHEADER));
bmp.Write(pData,dwLeng);
bmp.Close();
//这里,把该帧TIFF保存到了C盘的test.bmp中,可以用看图软件打开浏览一下。
//记得释放内存空间
deletepInfo;
pInfo=NULL;
deletepData;
pData=NULL;
//如果想直接显示,就不需要释放,调用StretchDIBits在客户区的DC上就可以显示了。
//如果再打开其他帧的话,从TIFFSetDirectory开始循环运行,比如取下一帧就是
TIFFSetDirectory(tiff,1);
//记得保存时另换一个bmp文件名。
//最后,对这个TIFF文件全部操作结束,记得调用
TIFFClose(tiff);
五
合成TIF文件
上面介绍的是从TIFF里读出一帧,现在介绍相反的过程,就是生成一个新的TIFF,向里面添加一幅BMP图,为介绍方便,同样假设图为24真彩色。
1首先打开一个BMP文件,
BITMAPFILEHEADERbh;
CFilefile;
file.Open("
\\a.bmp"
modeRead,NULL);
file.Read(&
bh,sizeof(BITMAPFILEHEADER));
DWORDdwSize=sizeof(BITMAPINFO)+
256*sizeof(RGBQUAD);
LPBITMAPINFOpInfo=(BITMAPINFO*)new
BYTE[sizeof(BITMAPINFO)+256*sizeof(RGBQUAD)];
file.Read(pInfo,sizeof(BITMAPINFO)+
256*sizeof(RGBQUAD));
intheight=
bmiHeader.biHeight;
intwidth=m_pInfo-&
bmiHeader.biWidth;
intdwBytePerLine=4*(width*
bmiHeader.biBitCount+31)/32;
intnSize=
bmiHeader.biSizeImage;
if(nSize
==0)
nSize=height*dwBytePerLine;
LPBYTEpData=newBYTE[nSize+32];
file.Seek(bh.bfOffBits,SEEK_SET);
file.Read(pData,nSize);
file.Close();
//把C盘上的位图文件a.bmp读出来,把信息部分存到pInfo中,数据部分存到pData中,供下面使用。
//然后成一个新的TIFF文件c:
\\a.tif,把上面信息写进来。
//下面的操作和上面读出数据相反,不做过多解释
uint32
width,height;
uint16
depth=8;
out=TIFFOpen("
\\a.tif"
w"
//打开TIFF文件
TIFFSetField(out,TIFFTAG_SUBFILETYPE,
FILETYPE_PAGE);
//表示存的图是多帧的
intnCur;
//当前的帧数
intnTotao;
//总帧数
TIFFSetField(out,TIFFTAG_PAGENUMBER,
nCur,nTotal);
//设置该帧属性
width=pInfo-&
height=pInfo-&
TIFFSetField(out,TIFFTAG_IMAGEWIDTH,
TIFFSetField(out,TIFFTAG_IMAGELENGTH,
TIFFSetField(out,TIFFTAG_ORIENTATION,
ORIENTATION_TOPLEFT);
TIFFSetField(out,TIFFTAG_SAMPLESPERPIXEL,
3);
TIFFSetField(out,TIFFTAG_BITSPERSAMPLE,
depth);
TIFFSetField(out,TIFFTAG_PLANARCONFIG,
PLANARCONFIG_CONTIG);
photometric=PHOTOMETRIC_RGB;
//表示存放格式为RGB
TIFFSetField(out,TIFFTAG_PHOTOMETRIC,
photometric);
TIFFSetField(out,TIFFTAG_ROWSPERSTRIP,height);
uint16compression=COMPRESSION_LZW;
//
TIFFSetField(out,TIFFTAG_COMPRESSION,
compression);
//TIFF按LZH压缩
uint32offset,size;
char*scanbuf;
size=((width*
bmiHeader.biBitCount+31)/32)*4;
scanbuf=(char*)_TIFFmalloc(size);
intnBitsPerPixel=
bmiHeader.biBitCount;
for(intnLines=0;
nLines&
nLines++)
DWORDdwWidthBytes=((width*pInfo-&
bmiHeader.biBitCount+31)
/32)*4;
LPBYTEp=newBY
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 使用 LibTiff 处理 TIFF 文件
![提示](https://static.bdocx.com/images/bang_tan.gif)