【发布时间】:2012-03-19 05:26:17
【问题描述】:
实际上,我不明白如何在 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 块来证明像素数据的正确性以供查看,但查看“原始”数据进行数值分析吗?
【问题讨论】:
-
IHDR 块中指定的位深度是多少? sBIT is not allowed to exceed that value;如果您没有使用 16 位深度,这可能就是它无法按预期工作的原因。
-
@MichaelMadsen 16:我使用
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 -
@MichaelMadsen 根据您发布的链接,我不得不怀疑:
sBIT块只是提供位掩码的一种手段吗?