php - 如何检测调色板 PNG 文件?

标签 php node.js imagemagick png

我想要一个在呈现如下所示的 PNG 文件时返回 true 的函数:

enter image description here

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/

相关文章:

javascript - Jquery 对话框删除行

node.js - Node.JS 中的简单 DNS 服务器? (主要/权威 DNS 服务器)(也许是 ndns?)

javascript - Express 路由文件中的 Socket.io

linux - 让 imagemagick 在共享主机上工作

php - Laravel 中显示类别、子类别和子子类别时出错

php - MYSQL 按字母顺序排序组中最后一条记录

php - 如何在mysql中获取字符串作为日期?

javascript - 如何在客户端使用 create-react-app 设置整个应用程序的环境变量

windows - imageMagick 的内存问题?

imagemagick - ImageMagick 给出 ' delegate failed ` 'uraw-batch' '