使用LibTIFF C++编写10、12位TIFF文件

14

我正在尝试使用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格式没有这样的标签。希望我是错的... - Alex F
2个回答

12

TIFF规范没有指定一种方法来存储图像中每通道10、12或14位的数据。根据编码器和解码器的不同,仍然可能可以处理这些图像,但这实际上是一个实现细节,因为不要求支持这些位深度。

如果您想在TIFF中获得超过8位的精度,那么您唯一的选择就是16位(或浮点数,但那是另一个故事)。

我不知道有任何图片格式专门支持这些位深度,所以如果您必须将图像存储为特定的位深度,则观看器可能会成为问题。我能想到的最简单的解决方法是将每像素存储为16位,并将原始位深度作为元数据存储(例如,在ImageDescription标签中),但这完全取决于图像将用于什么以及为什么需要此信息。


实际上,我也会推荐这个解决方案,因为奇异的位深度不会给你带来任何好处。 - Petr Abdulin
我使用了每个样本16位,并将实际位深度编码为元数据。谢谢。 - Itsik
3
我想指出 TIFF 标签 MAXSAMPLEVALUE 和 MINSAMPLEVALUE,它们可以被设置(至少通过 tifflib),并给出一些查看器(例如 ImageJ)所解释的可能值范围。请注意,这里只是翻译,没有解释或其他额外的内容。 - user9400869

1
您可以将图像存储为多图像文件。例如,对于12位源,一个图像将是使用高8位的RGB(8)图像,第二个16位灰度图像则是由低4位和4位填充的组合。这会产生一个TIFF,可以在标准程序上查看,并且可以使用自定义软件检索额外的精度。
我不同意“奇特”的位深度不好的说法。这种格式将使图像大小缩小5/6。您甚至可以将第二个图像仅存储为重新缩放的版本,该版本将紧密打包4位而不填充以实现3/4的大小减小。对于非常大的数据集,其中压缩不是选项的情况下,这种节省可能非常显着。即许多科学和机器视觉应用程序可能需要未经修改的位。从多图像tiff转换为16位tiff的能力将允许使用标准程序和图像库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接