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

Jam*_*mie 5 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 */
Run Code Online (Sandbox Code Playgroud)

在 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);
}
Run Code Online (Sandbox Code Playgroud)

像素数据相同。

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

Bit*_*ank 5

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