我想要一个在呈现如下所示的 PNG 文件时返回 true
的函数:
和 false
当呈现“自然”PNG(例如照片)或除 PNG 之外的任何东西(只是一系列颜色的转储)时,就像这个问题中提出的那样。
But what have you tried?
我什么也没尝试。我有一个或两个想法,例如随机采样水平和垂直的像素条并寻找完美的线性色度变化,但我在这里问是因为我想让 HiveMind 获得更好的洞察力,并且因为我知道大多数问题都有一个>非常简单解决方案。
我更喜欢 JavaScript 的解决方案(考虑使用 ImageMagick 的 NodeJS)或 PHP(使用 Imagick)。也就是说,只要算法可靠,任何语言都可以。
提前谢谢大家
最佳答案
只需查看文件中的“color_type”字节即可。如果是 3,则 PNG 被调色,否则不是。 color_type 字节是字节 25(在从字节 0 开始的 8 字节签名、4 字节长度、4 字节“IHDR” block 名称、4 字节宽度、4 字节高度和 1 字节位深度之后)。 请参阅 www.w3.org/TR/REC-png 上的 PNG 规范
正如 @leonbloy 评论的那样,你的示例 PNG 没有调色。这是颜色类型2 并且有超过 256 种颜色。
如果您确实想区分“自然”图像(例如照片)和图形艺术,而不是 PNG 颜色类型,您可以检查压缩比(未压缩与压缩的比率;未压缩的宽度*高度*pixel_size,压缩后的文件的大小是您正在检查的文件的大小)。自然图像的压缩效果不如 PNG 好。要从此计算中消除元数据,请使用 IDAT 总大小而不是文件大小。
或者,只需将图像转换为 PNG 和 JPEG。如果生成的 PNG 比 JPEG 大,这是很自然的。如果 PNG 比 JPEG 小,则它是图形艺术。使用您的示例图像,使用 ImageMagick,
convert 1T5aQ.png png:- | wc -c
59872
convert 1T5aQ.png jpg:- | wc -c
703739
PNG 的大小不到 JPEG 的 1/10,因此它是图形艺术。
关于php - 如何检测调色板 PNG 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504433/