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

C++ 使用LibTIFF C+编写10,12位TIFF文件+;,c++,tiff,libtiff,C++,Tiff,Libtiff,我正在尝试用LibTIFF编写10,12位RGB TIFF文件 像素数据本地保存在无符号短缓冲区(16位)中 1) 如果我将TIFFTAG\u BITSPERSAMPLE设置为10或12,则从缓冲区读取的位不足,输出不正确。(据我所知,它只是读取每个组件10或12位,而不是16位,这就是问题所在) 2) 我尝试将位打包到缓冲区中,使其实际上为12-R、12-G、12-B。在这种情况下,我认为文件写入正确,但我找不到任何查看器可以正确显示此图像 3) 如果我将TIFFTAG\u BITSPERSA

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

像素数据本地保存在
无符号短
缓冲区(16位)中

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

2) 我尝试将位打包到缓冲区中,使其实际上为12-R、12-G、12-B。在这种情况下,我认为文件写入正确,但我找不到任何查看器可以正确显示此图像

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

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

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

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

如果您希望TIFF中的精度超过8位,则只能选择16位(或浮点,但情况不同)


我不知道有哪种图像格式对这些位深度有特定的支持,因此,如果必须存储具有特定位深度的图像,那么查看器可能会遇到问题。我能想到的最简单的解决方法是只存储16位/像素,并将原始位深度作为元数据(例如,在ImageDescription标记中),但这一切都取决于图像的用途以及您需要此信息的原因。

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


我不同意“异国情调”的比特深度是不好的。这种格式会将图像大小减少5/6。您甚至可以将第二幅图像存储为一个重新缩放的版本,该版本将4位紧密压缩,无需填充以缩小3/4大小。对于非常大的数据集,由于数据的性质,压缩不是一种选择,因此这种节省是非常显著的。也就是说,许多科学和机器视觉应用可能需要未掺杂的比特。将多图像tiff转换为16位tiff的功能将允许使用标准程序和图像库。

我不久前问了同样的问题,没有结果,看起来tiff格式没有这样的标记。我希望我是错的…实际上我也建议将此作为一种解决方案,因为奇异的位深度不会给您带来任何好处。我使用每个样本16位,并将实际的位深度编码为元数据。Thanks我想指出可以设置的TIFF标记MAXSAMPLEVALUE和MINSAMPLEVALUE(至少使用tifflib),并给出一系列可能的值,这些值由一些查看器解释(例如ImageJ)。