首页 文章

32位TIFF图像显示为白色,与RAW不同

提问于
浏览
1

我在使用LibTIFF库保存图像时遇到问题 .

在我的代码中,我有一个浮点数组,表示图像的像素值 . 当我将这些值保存到RAW文件时,它看起来很好 . 但是,当我尝试使用LibTIFF库将其保存为TIFF文件时,当我在ImageJ中打开它时,图像看起来非常好,但是当我在Photoshop或Windows中打开它时,它看起来很奇怪(如下所示),Gimp显示完全透明的图像(就像图像中根本没有数据一样) .

我使用ImageJ打开RAW文件,图像类型设置为32位 - 勾选实数和小端字节顺序 .

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

我很确定我保存文件的方式有问题 - 但我不知道是什么 . 非常感谢你的帮助!

2 回答

  • 0

    您可能需要添加以下行以指示图像是浮动的32位 .

    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
    

    然后你不应该对可以读取浮点图像的程序有任何问题 .

  • 3

    我怀疑你用32位正确处理TIFF的方式有什么问题 . 不知道任何关于LibTIFF的事情,我假设您可以通过将代码中的相应行调整为 8 而不是 32 来更改创建的TIFF的bitdepth,所以它如下所示:

    TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 8);
    

    但是,请注意,如果原始数据的强度值大于8位可表示的强度值,则会导致信息丢失 . 我不知道LibTIFF如何在那里扩展 .

    但仅仅因为Windows / Gimp / Photoshop没有正确显示它们并不意味着TIFF文件被破坏 .

相关问题