如何将图像中的每个像素作为16位索引存储到颜色表中

How can I store each pixel in an image as a 16 bit index into a colortable?

本文关键字:索引 16位 存储 颜色 像素 图像      更新时间:2023-10-16

我有一个浮动值的2D数组:

float values[1024][1024];

我想存储为图像。

值在范围内:[-range,+range]。

我想使用一个从红色(-范围)到白色(0)再到黑色(+范围)的颜色表。

到目前为止,我一直在使用BMP文件格式将每个像素存储为32位RGBA。存储我的数组的总内存为1024*1024*4字节=4MB。

知道我的色表是"1维",而32 RGBA是"4维",这似乎非常有用。

明白我的意思;让我们假设我的颜色表从黑色(-范围)到蓝色(+范围)。在这种情况下,唯一变化的成分显然是B,所有其他成分都是固定的。所以我只得到了8比特的精度,而我正在为32:-(.)"付费"

因此,我正在寻找一种基于"调色板"的文件格式。理想情况下,我希望每个像素都是一个16位索引(无符号短整型),进入由2^16 RGBA值组成的"调色板"。在这种情况下,用于存储阵列的总内存为:1024*1024*2字节+2^16*4字节=2.25 MB。所以我会得到两倍的精度几乎一半的"价格"!

哪些图像格式支持此功能

目前,我正在使用Qt的QImage将数组作为图像写入文件。QImage具有内部8位索引("调色板")格式。我想要一个16位的。此外,我也不了解Qt的文档中哪些文件格式支持8位索引的内部格式。

将其存储为16位灰度PNG,然后自己手动制作颜色表。

你没有说明为什么你的图像可以分解成2^16种颜色,但利用你对这种特殊图像的了解,你可以制定一个算法,使彼此接近的索引具有相似的颜色,因此更容易压缩。

"我想使用一个从红色(-范围)到白色(0)再到黑色(+范围)的颜色表。"

好的,你有FF,00,00(红色)到FF,FF,FF(白色)到00,00,0(黑色)。在24位RGB中,在我看来,从红色到白色有256个值,然后从白色到黑色有256个。所以你不需要2^16(16384)的调色板大小;你需要2^9(512)。

如果你愿意妥协并使用2^8的调色板大小,那么GIF格式可以工作。这仍然是相对精细的分辨率:负片尺寸为128个红色阴影,正片尺寸为28个灰色阴影。GIF的256个调色板条目中的每一个都可以是RGB值。

PNG是基于调色板的颜色的另一个候选者。如果需要alpha通道,您可以使用PNG(包括RGBA)获得更大的灵活性。

您在问题中提到RGBA,但没有解释alpha通道的使用。

因此,与文件格式无关,如果您可以使用256项调色板,那么您将拥有一个非常好的压缩图像。回到您的映射要求(即映射浮动[-range->0.0->+range]到[red->white->black],这里有一个256项的调色板,涵盖了您想要的红白黑范围:

float    entry#  color  rgb
------  -------  -----  --------
-range    0  00  red    FF,00,00
          1  01         FF,02,02
          2  02         FF,04,04
             ...          ...
             ...          ...
        127  7F         FF,FD,FD
  0.0   128  80  white  FF,FF,FF
        129  81         FD,FD,FD
             ...          ....
             ...          ...
        253  FD         04,04,04
        254  FE         02,02,02
+range  255  FF  black  00,00,00

如果将颜色表的大小加倍为9位(512个值),则可以使RGB条目之间的增量更精细:增量为1而不是2。这样一个9位调色板将在范围的负侧和正侧提供RGB的完整单通道分辨率。考虑到你想做的映射,目前还不清楚分配16位调色板是否真的能够存储更多的视觉信息。我希望我能理解你的问题,也许这会有所帮助。

PNG格式支持高达8位的苍白格式,但也应支持高达16位的灰度图像。然而,16位模式的使用较少,并且可能缺乏软件支持。你应该先测试你的工具。

但是你也可以用普通的24位RGB真彩色PNG图像进行测试。它们经过压缩,在任何情况下都应该比BMP产生更好的结果。