【问题标题】:Non-deterministic* data in header/beginning of PNG filesPNG文件的标题/开头中的非确定性*数据
【发布时间】:2023-12-13 12:42:01
【问题描述】:

我注意到 Gimp 从相同的 RPG 数据创建的 PNG 文件除了一开始是相同的。此图像显示了使用 Gimp 创建的其他相同 PNG 文件的差异:

这些每次都会变化的数据是什么?它是如何编码的?有解码工具吗?你能从这些信息中学到一些东西吗?你能找出这个信息何时(可能)创建了 PNG 文件吗?

我的印象是 PNG 文件是确定性创建的*并且不存储解码图像所不需要的元数据。 (很明显,最后一部分也不正确,因为 Gimp 会将自己的名称写入文件中,但不会询问用户(如果您将某些内容导出为 JPEG 文件,则会询问用户)。)

*我在这里使用“确定性”一词来指代事物,并且仅在每次执行/导出/给定相同输入的情况下都相同的事物。我通常会使用“函数”这个词(即像数学函数),但我担心这可能会被不知道“函数”在数学中意味着什么的人误解。显然,这与信息论中这个词的用法不同。

【问题讨论】:

  • 您可以使用“pngcheck -v file.png”来获取更多信息的 PNG 块列表。
  • @GlennRanders-Pehrson 谢谢!

标签: data-structures graphics png metadata gimp


【解决方案1】:

请参阅PNG header definition

  • tIME 存储图像上次更改的时间,所以对我来说它与您创建的文件的时间戳相同。
  • bKGD 提供默认背景颜色。可能是您在 Gimp 中使用的 bakcgournd 颜色,或透明像素的颜色。
  • tEXT 带有键 Comment 和值 Created with Gimp 只是默认注释。您可以在Image>Properties 中更改图像的评论,您可以在Edit>Preferences>Default Image 中设置默认评论

当我两次导出同一个 PNG 时,我只看到 tIME 发生了变化。事实上,即使导出带有透明像素的 PNG,我也无法获得 bKGD 项目。导出时是否使用任何特定选项?

【讨论】:

  • 我只是拿了一个时间戳(Unix 时间)(1496679909)并将其转换为十六进制:593585E5 我什至没有在 diff 中看到任何 59 的出现(而且我在发布此问题之前不久创建了第二张图片)。如何解释 diff 中的数据以查找 PNG 图像的创建时间?
  • 我在导出图片时没有选择任何特殊选项。我只是按 Ctrl + Shift + E 来导出图像(不确定我是否总是按 shift 键),有时输入文件名,然后按 Enter。除了允许我绘制箭头和在码头中移动的东西的脚本之外,我的 Gimp 安装和配置只是官方主服务器上默认 Ubuntu 16.04 存储库的最新库存版本。我的 Gimp 版本是 2.8.16,但我不确定 Ubuntu 是否带有特殊设置或类似设置的 Gimp。
  • More complete specs(这是在 DuckDuckGo 上输入 png 格式规范时首先出现的)。时间不是存储为从纪元开始的秒数,而是存储为 Y/M/D/H/M/S 字节。
  • 谢谢!当我用谷歌搜索时,我得到的结果并不完全有用。
最近更新 更多