【发布时间】:2016-02-26 23:03:57
【问题描述】:
查看我在配备 Retina 显示屏并运行 OS X 10.11 的 MacBook Pro 上截取的屏幕截图,我发现它包含这些块:
IHDR, iCCP, pHYs, iTXt, iDOT, IDAT…, IEND
所有这些都是the 2003 spec 的一部分,除了iDOT 是一个小的(28 字节)块。根据chunk naming conventions,它的第二个字母是大写的事实应该表明它是一个具有公共规范的块。不过,我在任何地方都找不到它的规格。它也没有在Register of public PNG chunks and keywords, Version 1.4.6 中列出,尽管它似乎是the latest version。
网络上有很多网站都提到了这个块,包括 Stack Overflow 上的很多网站。大多数都在描述错误消息
ImageIO: PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk
那些得到解决的人发现某种图像损坏不一定是由于这个块,或者应用了一些可能也删除了这个块的转换。
许多页面还提到了 Retina 显示屏。这是我的猜测,并希望这个块以某种方式指示截屏时有效的显示密度。这对automatic scaling of screenshots 非常有用。
编辑: 再拍一些截图,我发现像素密度确实起到了一定的作用:以原始分辨率运行显示器我没有得到这样的块,并且图像尺寸如图所示截屏。只有在更高的密度下,我才能获得块和 PNG 图像大小,它是显示的整数倍。 28 个字节的数据似乎代表了 7 个 little-endian 32 位整数。对我来说,这些是(2, 0, h, 40, h, h, x),其中2 大概表示像素密度,h 是表观图像高度(即实际存储的高度的一半),x 是一些我根本不明白的数字。我不知道分数像素密度会如何进入这个游戏。
在哪里可以找到该块的详细信息甚至规范?我是否必须联系 Apple 或注册表,或者这里有人可以提供更多详细信息?
【问题讨论】:
-
我确认“iDOT”不是已注册的 PNG 块。
-
也许它与 CgBI PNG 有关。它们包含的 IDAT 与有效 PNG 文件中的 IDAT 不同。
-
“根据块命名约定,它的第二个字母是大写的事实应该表明它是具有公共规范的块”Apple滥用开放标准的另一个案例。
-
@Crissov:我同意在 png 列表上询问不太可能产生新信息。苹果开发者论坛的帖子仍未得到答复。我正在尝试想办法通过 Apple 将其升级。不过,我不知道任何合适的 Apple 渠道。也许我应该申请我自己的不兼容的
iDOT块变体,只是为了向 Apple 展示遵循注册程序的意义。不过,这似乎有些荒谬。 -
这篇博文能够对这个chunk的一些数据进行逆向工程:hackerfactor.com/blog/index.php?/archives/…作者甚至提到了这个问题。
标签: ios macos png retina-display file-format