5

实际上,我不明白在 PNG 文件中使用 sBIT 块。

我正在存储来自 11 位/通道 RGB 源的 PNG 文件,因此我尽职尽责地在 (c) 代码中设置了 sBIT 块:

...
png_color_8 sig_bit;

sig_bit.gray = 0;
sig_bit.alpha = 0;
sig_bit.red = 11;
sig_bit.green = 11;
sig_bit.blue = 11;

png_set_sBIT(png_ptr, info_ptr, &sig_bit);
...
/* save the png */

当使用 windows 查看器(原生 Vista 图片查看器/Paint.net)查看图像时,低 8 位被截断,所以我只能看到高 3 位。我原以为该sBIT块会自动指示读者将像素左移 5 位,以使 MSB 证明数据显示的合理性。似乎并非如此。

当我在代码中打开具有或不具有 sBIT 块的 png 文件时,请执行以下操作:

png_color_8p sig_bit;
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) {
    png_get_sBIT(png_ptr, info_ptr, &sig_bit);
    png_set_shift(png_ptr, sig_bit);
}

像素数据相同。

sBIT块的使用模型是什么?我可以以某种方式使用该sBIT块来证明像素数据的正确性以供查看,但查看“原始”数据进行数值分析吗?

4

2 回答 2

5

sBIT Chunk 告诉解码器像素数据中的有效位数。本质上,它告诉解码器数据已经左移以适应标准位深度。例如,对于 11 位数据的情况,您应该将像素左移 5 位并将它们存储为每像素 16 位。解码器将看到在每种颜色的 16 位中,只有前 11 位是重要的,因此它可以潜在地以新格式重新压缩图像,因为知道 16 位中只有 11 个有用的位。

于 2012-02-29T17:57:45.363 回答
0

您的源的位深度为 11,并且您正在使用它创建一个 16 位深度的 PNG 图像。因此,您应该从最高有效位到最低有效位设置为:MSB XXXX XXXX XXX0 0000LSB 2,其中 11X来自源。

“<a href="http://www.libpng.org/pub/png/spec/1.1/PNG-Chunks.html#C.sBIT" rel="nofollow noreferrer">解码器不需要注意sBIT块”来显示 创建的图像,因为位深为 11 的XXX XXXX XXXX2和位深为 16 的 2 是相同的值XXXX XXXX XXX0 0000

要提取源位,您需要将位右移 (16-11 sBIT)。注意:如果您在读取图像数据之前使用该值, libpng将为您完成这项工作;或者做国旗。好吧,回答这个问题:就是目的。png_set_shift() sBITpng_read_png()PNG_TRANSFORM_SHIFT

于 2021-01-02T12:58:00.760 回答