如何检测调色板的PNG文件?

我想有一个函数返回true时候提供一个PNG文件,如下所示:

在这里输入图像描述

在呈现“自然”PNG(例如照片)或任何非PNG(仅仅是颜色渐变的PNG)的情况下呈现,如本问题中呈现的那样。

但你有什么尝试?

我什么都没试过。 我有一个或两个想法,比如随机抽样水平和垂直像素条纹,并寻找完美的线性色度变化,但我在这里问,因为我想涉及到HiveMind更好的洞察力,因为我知道大多数问题有一个非常简单的解。

我更喜欢解决scheme是在JavaScript(想像NodeJS与ImageMagick)或PHP(与Imagick)。 也就是说,只要algorithm是稳定的,任何语言都可以。

提前感谢你们

只需查看文件中的“color_type”字节即可。 如果是3,PNG是调色板,否则不是。 color_type字节是字节25(在字节0,4字节长度,4字节“IHDR”块名称,4字节宽度,4字节高度和1字节bit_depth开始的8字节签名之后)。 请参阅www.w3.org/TR/REC-png上的PNG规范

不过@leonbloy评论说,你的PNG例子没有调色板。 它是颜色types2并且有超过256种颜色。

如果您真的试图区分“自然”图像(如照片)和graphics艺术,而不是PNG颜色types,则可以检查压缩比(未压缩比压缩比;未压缩比例宽度*高度*像素大小,压缩是你正在检查的文件的大小)。 自然图像的压缩效果不如PNG好。 要从此计算中消除元数据,请使用总IDAT大小而不是文件大小。

或者,只需将图像转换为PNG和JPEG。 如果得到的PNG大于JPEG,这是很自然的。 如果PNG小于JPEG,则是graphics艺术。 用您的示例图像,使用ImageMagick,

 convert 1T5aQ.png png:- | wc -c 59872 convert 1T5aQ.png jpg:- | wc -c 703739 

PNG不到JPEG尺寸的十分之一,所以它是graphics艺术。