bmp转tiff

来源:百度文库 编辑:神马文学网 时间:2024/05/01 20:04:01
if(!ISbmp(inputfile))
{
return      FALSE;
}
if(!IStif(outputfile))
returnFALSE;
BITMAPFILEHEADERbh;
CFilefile;
file.Open("D:\\sunchao\\test\\Debug\\abc.bmp",CFile::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 = pInfo->bmiHeader.biHeight;
intwidth = pInfo->bmiHeader.biWidth;
intdwBytePerLine = 4*(width * pInfo->bmiHeader.biBitCount + 31)/32;
intnSize = pInfo->bmiHeader.biSizeImage;
if(nSize  == 0)
{
nSize= height * dwBytePerLine;
}
LPBYTEpData = new BYTE[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;
TIFF*out = TIFFOpen("D:\\sunchao\\test\\Debug\\abc.tif","w");//打开TIFF文件
TIFFSetField(out,TIFFTAG_SUBFILETYPE, FILETYPE_PAGE);//表示存的图是多帧的
intnCur=1;//当前的帧数
intnTotal=1;//总帧数
TIFFSetField(out,TIFFTAG_PAGENUMBER, nCur,nTotal);//设置该帧属性
width= pInfo->bmiHeader.biWidth;
height= pInfo->bmiHeader.biHeight;
TIFFSetField(out,TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(out,TIFFTAG_IMAGELENGTH, height);
TIFFSetField(out,TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(out,TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(out,TIFFTAG_BITSPERSAMPLE, depth);
TIFFSetField(out,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
uint16    photometric = PHOTOMETRIC_MINISBLACK;//表示存放格式为RGB
TIFFSetField(out,TIFFTAG_PHOTOMETRIC, photometric);
TIFFSetField(out,TIFFTAG_ROWSPERSTRIP,height);
uint16compression = COMPRESSION_LZW;//
TIFFSetField(out,TIFFTAG_COMPRESSION, compression);
//TIFF按LZH压缩
uint32  size;
char*scanbuf;
size= ((width * pInfo->bmiHeader.biBitCount + 31) /32)*4;
scanbuf= (char *) _TIFFmalloc(size);
intnBitsPerPixel = pInfo->bmiHeader.biBitCount;
BYTE* bits;
for(intnLines = 0; nLines < height; nLines++)
{
bits= pData +width*height- nLines * width;
if   (TIFFWriteScanline(out,bits,   nLines,  0)==-1)  return FALSE;
}
_TIFFfree(scanbuf);
TIFFWriteDirectory(out);
deletepData;
pData= NULL;
deletepInfo;
pInfo= NULL;
//到这里,向TIFF文件加了一张图,如再加下一张的话,循环操作
TIFFClose(out);
returnTRUE;