You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手工制作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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:18:10