2014-07-06 87 views
1

我在使用LibTIFF庫保存圖像時遇到問題。32位TIFF圖像顯示爲白色,與RAW不同

在我的代碼中,我有一個浮點數組,代表圖像的像素值。當我將這些值保存到RAW文件時,它看起來很好。但是,當我嘗試使用LibTIFF庫將其保存爲TIFF文件時,在ImageJ中打開它時圖像看起來非常好,但是當我在Photoshop或Windows中打開它時,它看起來很奇怪(看下面),Gimp顯示一個完全透明的圖像(就像圖像中根本沒有數據)。

我使用ImageJ打開RAW文件,圖像類型設置爲32位 - 真實和Little-endian字節順序被打勾。

RAW on the left, TIFF on the right

下面是我用它來保存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); 

我敢肯定有什麼地方錯了,我保存文件的方式 - 但我不知道是什麼。非常感謝你的幫助!

回答

0

我懷疑你保存它的方式有什麼問題 - 只是Windows Image Viewer無法正確處理32位的TIFF。不知道有關的libtiff什麼,我會假設你可以通過調整相應的線路在代碼8,而不是32改變產生的TIFF位深,所以讀這樣的:

TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 8); 

但是,請意識到如果您的原始數據具有比可以用8位表示的強度值更多的信息,則會導致信息丟失。我不知道LibTIFF如何在那裏進行縮放。

但是,僅僅因爲Windows/Gimp/Photoshop沒有正確顯示它們並不意味着TIFF文件被破壞。

+1

在截圖中查看正確的圖片,我猜這只是32位TIFF文件中的低8位。所以這可能是Windows Image Viewer在遇到它只能部分理解的東西時所做的;) – he1ix

3

您可能需要添加以下行以指示圖像浮動32位。

TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); 

然後,你應該沒有任何問題,可以讀取浮動圖像的程序。

+0

您救了我!在常見的可用libtiff-tutorials中沒有這種有價值的提示。 – Pepschmier

相關問題