实际上,我不理解在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查看器(native Vista picture viewer/Paint.net)查看图像时,下面的8位被截断,因此我只能看到上面的3位我本以为sBIT块会自动指示读者向左移动像素5位,以最大限度地调整数据的显示似乎不是这样。
当我在代码中打开包含或不包含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块来MSB调整像素数据以供查看,但查看“原始”数据以进行数值分析?

最佳答案

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

10-08 06:20