实际上,我不理解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块来将像素数据左对齐以进行查看,但在数字分析中查看“原始”数据?
png_set_IHDR(img->p,img->i,width,height,16,PNG_COLOR_TYPE_RGB,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
设置了IHDR。 - JamiesBIT
块是否只是提供位掩码的一种方式? - Jamie