使用 Libtiff 进行位图到 Tiff 转换






4.35/5 (11投票s)
2003年12月29日
1分钟阅读

334383

6733
使用 Libtiff 进行位图到 Tiff 转换
引言
本文/代码片段的作用: 使用 Libtiff 将 256 色位图文件转换为黑白 Tiff 文件。
为什么有用: 本文提供了一种将位图图像转换为 Tiff 图像的方法。此演示项目的主要目标是向您展示如何写入 Tiff 文件。我尝试了很长时间才能找到可以写入 Tiff 文件的示例代码。但没有人能提供一个像我希望的那样简单的代码。现在,这段代码至少可以帮助您。我已包含此演示中使用的位图图像。
Libtiff 在哪里?: 您可以从 http://www.libtiff.org/ 免费获取 Libtiff 库。此外,我已在演示项目中包含库文件。所有库内容均按原样提供,并具有其所有者的权利。我与该库的错误无关。我只是使用此库来演示如何将 bmp 转换为 tiff。
如何使用此代码
我将所有转换代码收集到一个函数中,该函数将 bmp 转换为 tiff,函数如下,或者您可以在演示项目中找到此代码。
//load Bitmap HBITMAP hImage = (HBITMAP)LoadImage(NULL, "C:\\MyBit.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE); CBitmap* m_Bitmap = CBitmap::FromHandle(hImage); //Memory allocation is still 600x600 in your code.. BYTE* bmpBuffer=(BYTE*)GlobalAlloc(GPTR, 600*600);//allocate memory // Size of bitmap as I draw by using x,y points... m_Bitmap->GetBitmapBits(600*600 ,bmpBuffer); TIFF *image; // Open the TIFF file if((image = TIFFOpen("C:\\output.tif", "w")) == NULL) { printf("Could not open output.tif for writing\n"); } TIFFSetField(image, TIFFTAG_IMAGEWIDTH,600); TIFFSetField(image, TIFFTAG_IMAGELENGTH,600); TIFFSetField(image, TIFFTAG_BITSPERSAMPLE,8); TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL,1); uint32 rowsperstrip = TIFFDefaultStripSize(image, -1); //<REC> gives better compression TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, rowsperstrip); TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS); // Start CCITTFAX3 setting uint32 group3options = GROUP3OPT_FILLBITS+GROUP3OPT_2DENCODING; TIFFSetField(image, TIFFTAG_GROUP3OPTIONS, group3options); TIFFSetField(image, TIFFTAG_FAXMODE, FAXMODE_CLASSF); TIFFSetField(image, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, -1L); // End CCITTFAX3 setting TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); TIFFSetField(image, TIFFTAG_XRESOLUTION, 100.0); TIFFSetField(image, TIFFTAG_YRESOLUTION, 100.0); char page_number[20]; sprintf(page_number, "Page %d", 1); TIFFSetField(image, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE); TIFFSetField(image, TIFFTAG_PAGENUMBER, 1, 1); TIFFSetField(image, TIFFTAG_PAGENAME, page_number); // Write the information to the file BYTE *bits; for (int y = 0; y < 600; y++) { bits= bmpBuffer + y*600; if (TIFFWriteScanline(image,bits, y, 0)==-1) MessageBox("Complete or error"); } // Close the file TIFFClose(image);
此更新中的新内容
- 改进的压缩
- 多页 Tiff(添加页面到 Tiff 的方法)
- 256 色 bmp
接下来是什么?
- Tiff 文件中的颜色
- 其他格式转换为 Tiff
我的愿望是为您提供一个可以在任何地方使用的独立函数。我在本文中做到了这一点。
我期望你们什么?
我认为我不是像你们这样的大师,还有很长的路要走。请指出我文章中的错误,以便我改进。谢谢,好的!再见,祝您生活愉快...