如何检测调色板PNG文件?

时间:2014-02-01 22:23:34

标签: php node.js imagemagick png

我希望有一个函数在出现PNG文件时返回true,如下所示:

enter image description here

false当呈现“自然”PNG(例如照片)或任何其他而非PNG时,只是一个颜色渐变的转储,如一个在这个问题中提出。

  

但是你尝试了什么?

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

我更希望解决方案是JavaScript(想想带有ImageMagick的NodeJS)或PHP(带有Imagick)。也就是说,只要算法是可靠的,任何语言都可以。

提前感谢你们

1 个答案:

答案 0 :(得分:1)

只需查看文件中的“color_type”字节即可。如果它是3,则调整PNG,否则不调整。 color_type字节是字节25(在字节0开始的8字节签名之后,4字节长度,4字节“IHDR”块名称,4字节宽度,4字节高度和1字节bit_depth)。 请参阅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大小的十分之一,因此它是图形艺术。