1

LibTIFF ライブラリを使用して画像を保存する際に問題があります。

私のコードには、画像のピクセル値を表す float の配列があります。これらの値を RAW ファイルに保存すると、問題ないように見えます。ただし、LibTIFF ライブラリを使用して TIFF ファイルとして保存しようとすると、ImageJ で開くと画像は完全に正常に見えますが、Photoshop または Windows で開くと奇妙に見え (下を参照)、Gimp が表示されます完全に透明な画像 (画像にデータがまったくないように)。

ImageJ を使用して RAW ファイルを開きます。イメージ タイプは 32 ビットに設定されています - 実数およびリトル エンディアンのバイト オーダーが選択されています。

左がRAW、右がTIFF

TIFF 画像を保存するために使用するコードは次のとおりです。

TIFF *tif= TIFFOpen(name, "w");

TIFFSetField (tif, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField (tif, TIFFTAG_IMAGELENGTH, height);
TIFFSetField (tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField (tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField (tif, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField (tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 32);
TIFFSetField (tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);

tsize_t strip_size = TIFFStripSize (tif);
tstrip_t strips_num = TIFFNumberOfStrips (tif); 

float* strip_buf=(float*)_TIFFmalloc(strip_size);
for (unsigned int s=0; s<strips_num; s++) {
    for (unsigned int col=0; col<width; col++) {
        strip_buf[col]=image[s][col];
    }
    TIFFWriteEncodedStrip (tif, s, strip_buf, strip_size);

}
_TIFFfree(strip_buf);
TIFFClose(tif);

ファイルの保存方法に問題があることは確かですが、何が原因かわかりません。助けてくれてどうもありがとう!

4

2 に答える 2

0

保存方法に何か問題があるのではないかと思います。Windows イメージ ビューアーが 32 ビットの TIFF を適切に処理できないというだけです。8LibTIFFについて何も知らないので、コード内の対応する行を の代わりに調整することで、作成されたTIFFのビット深度を変更できると思います32。したがって、次のようになります。

TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 8);

ただし、元のデータの強度値が 8 ビットで表現できる値よりも大きい場合は、情報が失われることに注意してください。そして、LibTIFFがそこでスケーリングを行う方法がわかりません。

しかし、Windows / Gimp / Photoshop で正しく表示されないからといって、TIFF ファイルが壊れているわけではありません。

于 2014-07-08T15:36:17.420 に答える