【问题标题】:Interpret PNG pixel data解释 PNG 像素数据
【发布时间】:2014-12-14 21:24:48
【问题描述】:

查看PNG specification,似乎PNG像素数据块以IDAT开头并以IEND结尾(解释稍微清晰here)。中间是对我来说没有意义的价值观。

如何在不使用任何库(即来自原始二进制文件)的情况下从中获取可用的 RGB 值?

例如,我在 Photoshop 中制作了一个 2x2px 的图像,其中包含 4 个黑色 rgb(0,0,0) 像素:

这是结果数据(在原始二进制输入、十六进制值和人类可读的 ASCII 中):

BINARY      HEX ASCII
01001001    49  'I'
01000100    44  'D'
01000001    41  'A'
01010100    54  'T'
01111000    78  'x'
11011010    DA  '\xda'
01100010    62  'b'
01100000    60  '`'
01000000    40  '@'
00000110    06  '\x06'
00000000    00  '\x00'
00000000    00  '\x00'
00000000    00  '\x00'
00000000    00  '\x00'
11111111    FF  '\xff'
11111111    FF  '\xff'
00000011    03  '\x03'
00000000    00  '\x00'
00000000    00  '\x00'
00001110    0E  '\x0e'
00000000    00  '\x00'
00000001    01  '\x01'
10000011    83  '\x83'
11010100    D4  '\xd4'
11101100    EC  '\xec'
10001110    8E  '\x8e'
00000000    00  '\x00'
00000000    00  '\x00'
00000000    00  '\x00'
00000000    00  '\x00'
01001001    49  'I'
01000101    45  'E'
01001110    4E  'N'
01000100    44  'D'

【问题讨论】:

    标签: binary hex png rgb pixel


    【解决方案1】:

    您错过了两个规范中一个相当重要的细节:

    官方:

    .. IDAT 块包含实际的图像数据,它是压缩算法的输出流。
    [...]
    PNG 中的 Deflate 压缩数据流以“zlib”格式存储。

    维基百科:

    IDAT 包含图像,可以在多个 IDAT 块中拆分。这种拆分会稍微增加文件大小,但可以以流式方式生成 PNG。 IDAT块包含实际的图像数据,是压缩算法的输出流。

    两者都表示原始图像数据已压缩。查看您的数据,前 2 个字节

    78 DA
    

    包含RFC1950 中指定的压缩标志。其余数据被压缩。

    使用通用的zlib 兼容例程解压缩它会显示 14 字节的输出:

    00 00 00 00 00 00 00
    00 00 00 00 00 00 00
    

    其中每个第一个字节是 PNG 行过滤器(两行均为 0),然后是 2 个 RGB 三元组 (0,0,0),用于图像的 2 行。

    “不使用任何库”您需要 3 个单独的例程来:

    1. 读取和解析PNG上层结构;这提供了IDAT 压缩数据,以及宽度、高度和颜色深度等基本信息;
    2. zlib 部分解压为原始二进制数据;
    3. 解析解压缩的数据,根据需要处理 Adam-7 隔行扫描,并应用行过滤器。

    只有在执行这三个步骤后,您才能访问原始图像数据。其中,您似乎很好地掌握了步骤(1)。步骤(2)更难自己“做”;就个人而言,我在自己的 PNG 处理程序中作弊并使用了miniz。第 3 步同样只是一个决心的问题。所有必要的信息都可以在网络上找到,但需要一段时间才能将所有信息按正确的顺序排列。 (就在最近,我在执行很少使用的 Paeth 行过滤器时发现了一个错误——它没有被注意到因为它在“现实世界”图像中很少使用。)

    查看Building a fast PNG encoder issues 进行类似讨论,查看Trying to understand zlib/deflate in PNG files 深入了解 Deflate 方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-17
      • 2012-10-06
      • 2010-09-22
      • 2014-03-19
      • 2013-04-14
      • 1970-01-01
      • 2019-10-23
      • 2011-08-09
      相关资源
      最近更新 更多