TIFFWriteScanline适用于Windows和Linux但在Mac上失败
更新了问题:
我使用libtiff3.9.4在mac上用c ++读写TIFF文件 10.6.4。我的项目是可移植的,没有任何运行 Windows 32位和Ubuntu 64位上的问题。但在Mac上 Libtiff函数TIFFWriteScanline总是失败(返回!= 1)。该 TIFF文件已创建,但它没有任何内容。我能够 阅读LZW压缩图像,但我无法写入。 此外,该程序还适用于Windows上的CCITT Group4图像 和linux,但读取扫描线在mac上失败。
我没试过libtiff3.8.2和libtiff4.0.0beta6。
为什么libtiff在mac工作时不会在mac上写入扫描线的任何想法 在linux上好吗?
代码:
// set baseline tags
TIFFSetField(tiffImage, TIFFTAG_IMAGEWIDTH, 7368);
TIFFSetField(tiffImage, TIFFTAG_IMAGELENGTH, 4757);
TIFFSetField(tiffImage, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tiffImage, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tiffImage, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tiffImage, TIFFTAG_COMPRESSION, COMPRESSION_LZW);
TIFFSetField(tiffImage, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tiffImage, TIFFTAG_THRESHHOLDING, 1);
TIFFSetField(tiffImage, TIFFTAG_XRESOLUTION, 400;
TIFFSetField(tiffImage, TIFFTAG_YRESOLUTION, 400);
TIFFSetField(tiffImage, TIFFTAG_RESOLUTIONUNIT, 2);
uint32 rowsPerStrip;
rowsPerStrip = tiffData->height;
rowsPerStrip = TIFFDefaultStripSize(tiffImage, rowsPerStrip);
TIFFSetField(tiffImage, TIFFTAG_ROWSPERSTRIP, rowsPerStrip);
TIFFSetupStrips(tiffImage);
// row buffer
scanlineSize = TIFFScanlineSize(tiffImage);
scanline = (unsigned char*) _TIFFmalloc(scanlineSize);
// write image
for (int i = 0; i < iplImage->height; i++)
{
memcpy(scanline, iplImage->imageData + iplImage->widthStep*i, scanlineSize);
if(TIFFWriteScanline(tiffImage, scanline, i, 0) != 1){
//Error
}
}
// clean up
_TIFFfree(scanline);
答案 0 :(得分:1)
很难说出你提供的信息,但我最好的猜测是你编译了libtiff而不支持你正在使用的特定输出格式。
此外,如果TIFFWriteScanline返回-1,除非您替换了自己的错误处理程序,否则应该会显示错误消息。这应该是一个有用的线索,了解正在发生的事情。
答案 1 :(得分:1)
很久以前我把这个问题移到了LibTiff的邮件列表中,但我忘记在这里给出答案,所以这里是:
我在Libtiff中插入了printf并修改了一些TiffError消息 代码,事实证明,这些变化在任何时候都没有显示出来 我的节目失败了。在几个小时后搜索我发现了 OpenCV中的内置Libtiff库(libhighgui.dylib)就是其中的原因 我的头痛。我知道OpenCV使用Libtiff,但我没有使用内置版本 版本,因为它不提供Libtiff的全部功能。一世 重新安装没有Libtiff的OpenCV2.1.0它解决了这个问题(它 可能只是所包含的依赖项的顺序 造成麻烦)。
我现在能够编写LWZ压缩图像。有关更多详细信息,请参阅LibTiff邮件列表。