使用LibTIFF C ++写入10,12位TIFF文件

问题描述 投票:13回答:2

我正在尝试使用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文件的正确方法是什么?

c++ tiff libtiff
2个回答
10
投票

The TIFF specification没有指定在图像中每个通道存储10、12或14位的方法。视编码器和解码器而定,仍可能可以处理此类图像,但实际上是实现细节,因为不需要它们。

如果您希望TIFF中的精度超过8位,则唯一的选择是16(或浮点数,但这是不同的说法。)>

我不知道有任何特定格式支持这些位深度的图像格式,因此,如果必须存储具有特定位深度的图像,无论如何观众都可能会遇到问题。我能想到的最简单的解决方法是将每个像素存储为16位,并将原始位深度作为元数据(例如,放在ImageDescription标签中),但这全都取决于图像的用途以及为什么需要此信息。

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

我不同意“奇异”位深度不好。这种格式会将图片大小减少5/6。您甚至可以将第二张图像存储为重新缩放的版本,该版本将紧紧包装4位而不用填充以缩小3/4尺寸。对于非常大的数据集,这种节省可能非常可观。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.