用LibTIFF c++编写10,12位TIFF文件

Writing 10,12 bit TIFF files with LibTIFF C++

本文关键字:12位 TIFF 文件 LibTIFF c++ 编写      更新时间:2023-10-16

我正在尝试用LibTIFF编写10,12位RGB TIFF文件。

像素数据本地保存在unsigned short缓冲区(16位)

1)如果我将TIFFTAG_BITSPERSAMPLE设置为10或12,则从缓冲区读取的比特不足,输出不正确。(我知道它只是每个组件读取10或12位,而不是16,这就是问题)

2)我试着把比特打包到缓冲区中,这样它就真的是12-R, 12-G, 12-B了。在这种情况下,我认为文件写入正确,但我找不到可以正确显示此图像的查看器。

3)如果我设置TIFFTAG_BITSPERSAMPLE为16,观众可以显示TIFF图像,但我有一个问题,我不知道如果图像最初是10或12位(如果我想以后用LibTIFF读取它)。此外,观看者希望动态范围是16位,而不是10位或12位,这也会导致糟糕的视图。

4)最恼人的部分是,我找不到一个10,12,或14位的TIFF图像在网络上看看标题应该是什么样子。

那么最后,将10位或12位图像数据写入TIFF文件?????的正确方法是什么

TIFF规范没有指定在图像中每通道存储10、12或14位的方法。根据编码器和解码器的不同,可能仍然可以处理这样的图像,但它实际上是一个实现细节,因为它们不需要这样做。

如果您希望TIFF中的精度超过8位,您唯一的选择是16位(或浮点数,但这是另一回事)。

我不知道有任何图像格式对这些位深有特定的支持,所以如果你必须用特定的位深存储图像,无论如何查看器都可能会遇到问题。我能想到的最简单的解决方案是将其存储为每像素16位,并将原始位深作为元数据(例如,在ImageDescription标签中),但这一切都取决于图像将用于什么以及为什么需要此信息。

您可以将图像存储为多图像文件。例如,对于12位源,一个图像将是RGB(8)图像,使用上面的8位,第二个16位灰度是低4位和4位填充的组合。这样就可以用标准程序在监视器上查看TIFF,并且可以使用定制软件检索额外的精度。

我不同意"外来"位深度不好的说法。这种格式将使图像大小减少5/6。您甚至可以将第二张图像存储为重新缩放的版本,该版本将4位紧密打包,而不使用填充,以减少3/4的大小。对于非常大的数据集,由于数据的性质,压缩不是一种选择,这种节省是非常重要的。例如,许多科学和机器视觉应用程序可能需要未经掺入的比特。从多图像tiff转换为16位tiff的能力将允许使用标准程序和图像库。