【问题标题】:Why does printing a png file in Python3 result in extra characters in IDAT chunk?为什么在 Python3 中打印 png 文件会导致 IDAT 块中出现额外字符?
【发布时间】:2015-02-04 00:44:53
【问题描述】:

所以我一直在测试在 Python3 中使用以下代码读取未压缩的 png 文件:

f = open(r'img1.png', 'rb')
pixel = f.read()
print(pixel)

但是,除了我期望在 IDAT 块中的十六进制对之外,结果还给出了一些奇怪的附加字符:

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x02\x00\x00\x00\x02\x08\x02\x00\x00\x00\ xfd\xd4\x9as\x00\x00\x00\x19IDAT\x08\x1d\x01\x0e\x00\xf1\xff\x00\x00\x00\x00\x00\xff\xff\x01\x00\xff\xff\ x13\x90\x90\x1b\xe4 \x0510O\xffC \x00\x00\x00\x00IEND\xaeB`\x82' 【0.1s完成】

知道这是什么吗?我假设当数据未压缩时,IDAT 中的所有内容都是十六进制对的像素数据。我已经搜索了 StackOverflow/Online 以及查看了 PNG 的文档,但没有任何运气。

这是我用来测试的图像的链接(只有 4 个像素): img1.png

仅供参考,如果有帮助,我正在通过 ArchLinux 运行测试。

【问题讨论】:

  • 图像可能格式不正确。您是否在其他图像文件中看到过类似的模式?
  • 只是仔细检查 - 你知道\x0510O 是字节序列0x05 0x31 0x30 0x4f 而不是一些奇怪的多字节序列?
  • 不要忘记,PNG 中的每条扫描线都以一个额外的字节开始,以标识用于该线的预过滤器。无论每个像素有多少字节,每条扫描线只需多出一个字节。
  • 是的,@senshin 这正是我遗漏的信息。谢谢!

标签: python-3.x hex png


【解决方案1】:

我怀疑 senshin 的评论是当场的。

在打印二进制数据时,Python 只打印可打印的 ASCII 字符,其余字节为 \xHH,其中 H 是十六进制数字。

因此子序列\xe4\x0510O\xffC\x00就是以下8个字节的序列:

\xe4
\x05
1     ----> ASCII character '1', equivalent to \x31
0     ----> etc
O
\xff
C
\x00

当然,在这种情况下,我们希望所有字节都打印为十六进制,因为所有这些字节都旨在被理解为二进制数据,而不是文本字符。但是 Python 猜不到。

如果你想将所有字节打印为十六进制,你可以看到一些recipes here。但是请注意,在某些情况下,您更喜欢 ASCII 输出(开头的 'PNG' 序列和块标识符......),所以没有灵丹妙药。

【讨论】:

  • 感谢@leonbloy 的解释和链接;这有很大帮助。现在我可以从那里弄清楚如何使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多