手工制作PNG文件时256字节长度引发的渲染全黑异常问题
我最近一直在手工逐字节构建PNG文件,现在碰到一个诡异的问题:当原始像素数据+过滤器类型字节的总长度刚好是256时,图像完全无法正常渲染,所有像素都变成黑色。其他尺寸的文件我都成功做出来了,唯独这个情况不行。
以下是该图像的十六进制数据(已分块着色可视化):
PNG初始字节
0x89 0x50 0x4e 0x47 0x0d 0x0a 0x1a 0x0a:PNG文件必须以这些字节开头,用于标识文件类型。
IHDR块
0x00 0x00 0x00 0x0d:块数据部分的长度。0x49 0x48 0x44 0x52:IHDR块的标识符。0x00 0x00 0x00 0xff:图像宽度(255像素)。0x00 0x00 0x00 0x01:图像高度(1像素)。0x08:每个颜色通道的位深度(8位)。0x00:图像颜色类型,此处为单通道灰度图。0x00:图像压缩方法,0x00是唯一有效值。0x00:图像过滤器方法,0x00是唯一有效值。0x00:隔行扫描方法,0x00表示无隔行扫描。0x34 0xfb 0x27 0x7f:从标识符开头到此处字节的CRC-32值。
IDAT块
0x00 0x00 0x01 0x0b:块数据部分的长度。0x49 0x44 0x41 0x54:IDAT块的标识符。0x08:zLib压缩数据格式的CMF,使用256的滑动窗口(参考RFC1950)。0x1d:zLib压缩数据格式的FLG,FLEVEL为0,无FDICT(参考RFC1950)。0x80:表示这是最后一个压缩数据块,且未启用压缩。0x01 0x00:压缩数据的长度(256,即过滤器类型字节+原始像素数据)。0xfe 0xff:上述字节的取反值。0x00:当前扫描线使用的过滤器类型,0x00表示无过滤器。- 从
0xff到地址00000120末尾为实际像素数据,因位深度8且为灰度图,每个0xff代表白色像素。 0x08 0xf1 0xfe 0x02:从地址00000030开头到00000120末尾字节的Adler-32值。0x33 0xed 0xdb 0x91:从标识符开头到此处十六进制数据的CRC-32值。
IEND块
0x00 0x00 0x00 0x00:块数据部分的长度,IEND块无数据。0x49 0x45 0x4e 0x44:IEND块的标识符。0xae 0x42 0x60 0x82:仅标识符字节的CRC-32值(因无数据)。
我试过修改颜色类型和位深度,但只要未压缩的压缩数据总和是256,文件就无法正确渲染,全黑。滑动窗口从256到32768都试过,没用。会不会需要加sRGB这类辅助块?不确定原因。
内容的提问来源于stack exchange,提问作者MathVoider
相关产品推荐
相关产品推荐

