65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Libtiff 进行位图到 Tiff 转换

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (11投票s)

2003年12月29日

1分钟阅读

viewsIcon

334383

downloadIcon

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);


此更新中的新内容

  1. 改进的压缩
  2. 多页 Tiff(添加页面到 Tiff 的方法)
  3. 256 色 bmp

接下来是什么?

  1. Tiff 文件中的颜色
  2. 其他格式转换为 Tiff

我的愿望是为您提供一个可以在任何地方使用的独立函数。我在本文中做到了这一点。

我期望你们什么?

我认为我不是像你们这样的大师,还有很长的路要走。请指出我文章中的错误,以便我改进。谢谢,好的!再见,祝您生活愉快...

© . All rights reserved.