PNG文件中sBIT块的用途是什么?

时间:2012-02-29 17:43:13

标签: c png libpng

实际上,我不明白在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来证明数据显示。似乎并非如此。

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

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块来验证像素数据的MSB,但是看看“原始”数据进行数值分析吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您的源的位深度为 11,您正在从中创建一个 16 位深度的 PNG 图像。因此,您应该将位(从最高有效位到最低有效位)设置为:MSBXXXX XXXX XXX0 0000LSB2,其中11 个 X 来自源代码。

A decoder need not pay attention to the sBIT chunk显示创建的图像,位深为11和XXX XXXX XXXX<的XXXX XXXX XXX0 00002 sub>2在位深为16的情况下是相同的值。

要提取源位,您需要将位右移 (16-11sBIT)。注意:如果您在读取图像数据之前使用 png_set_shift() sBITlibpng 将为您完成这项工作;或使用 png_read_png() 标志执行 PNG_TRANSFORM_SHIFT。好吧,回答这个问题:就是目的。