1

TIFFWriteScanline は Windows と Linux では機能しますが、Mac では失敗します

更新された質問:

Mac 10.6.4 の c++ で TIFF ファイルを読み書きするために libtiff3.9.4 を使用しています。私のプロジェクトは移植できるように書かれており、Windows 32 ビットと Ubuntu 64 ビットの両方で問題なく動作します。しかし、Mac では、Libtiff 関数 TIFFWriteScanline は常に失敗します (!= 1 を返します)。TIFF ファイルが作成されますが、内容がありません。LZW 圧縮イメージを読み取ることはできますが、書き込むことができません。さらに、このプログラムは Windows と Linux の CCITT Group4 イメージでも機能しますが、Mac ではスキャンラインの読み取りに失敗します。

libtiff3.8.2 と libtiff4.0.0beta6 の両方を試しましたが、うまくいきませんでした。

libtiff が Linux で正常に動作しているのに、Mac でスキャンラインを書き込まない理由はありますか?

コード:

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

2 に答える 2

1

私はずっと前にこの質問をLibTiffメーリングリストに移動しましたが、ここで答えを出すのを忘れたので、ここにあります:

printfを挿入し、LibtiffコードのいくつかのTiffErrorメッセージを変更しましたが、プログラムが失敗したときにこれらの変更がどこにも表示されないことがわかりました。数時間検索した後、OpenCVに組み込まれているLibtiffライブラリ(libhighgui.dylib)が私の頭痛の原因であることがわかりました。OpenCVがLibtiffを使用していることは知っていますが、Libtiffの全機能を提供していないため、組み込みバージョンは使用していません。LibtiffなしでOpenCV2.1.0を再インストールしたところ、問題は解決しました(問題を引き起こしていたのは、含まれている依存関係の順序であった可能性があります)。

これで、LWZ圧縮画像を作成できるようになりました。詳細については、LibTiffメーリングリストを参照してください。

于 2012-08-07T07:15:56.720 に答える
1

あなたが提供した情報で判断するのは難しいですが、私の推測では、使用している特定の出力形式をサポートせずに libtiff をコンパイルしたということです。

また、TIFFWriteScanline が -1 を返す場合は、独自のエラー ハンドラを置き換えていない限り、エラー メッセージが表示されます。これは、何が起こっているかについての有用な手がかりになるはずです。

于 2011-04-17T06:08:43.857 に答える