如何自动检测调色板与真彩色 png

Posted

技术标签:

【中文标题】如何自动检测调色板与真彩色 png【英文标题】:How can I auto-detect palette vs. truecolor png 【发布时间】:2012-01-31 20:28:24 【问题描述】:

如 GD 手册中所述,以下代码始终生成调色板图像:

$image = GD::Image->newFromPngData($mydata);

虽然以下会产生真彩色图像:

$image = GD::Image->newFromPngData($mydata,1);

但是,我想要做某种自动检测:

对“8-bit colormap png”使用调色板,但对“8-bit/color RGB png”文件使用真彩色。

我希望这是默认设置,但事实并非如此。

我没有在 libgd 手册中找到暗示这是可能的。是否可以通过手动读取 png 标头中的信息来从数据本身中提取此信息?

为了更清楚地说明这一点,这里有一些不会自动检测任何内容的代码示例:

#!/usr/bin/perl

use GD;

$image = GD::Image->newFromPng($ARGV[0]);

if ($image->isTrueColor()) 
  print "truecolor\n";
 else 
  print "indexed\n";

【问题讨论】:

【参考方案1】:

可能可以在文件头中搜索您想要的内容,但结果可能容易出错。

最好使用可以为您解析标题的工具。 CPAN 搜索揭示了一些可能效果很好的方法:

Image::ExifTool

Image::EXIF

Image::PNG

和其他人。


但从 GD 文档来看,当 newFromPngData 仅传递一个参数时,自动检测似乎是默认设置:

通过读取PNG图像创建的图像将是真彩色,如果图像 文件本身是真彩色。要强制图像基于调色板,请通过 可选的 $truecolor 参数中的值 0。

如果自动检测对您不起作用,您应该验证您的源文件确实是您认为的那样,如果 GD 解释错误,也许您应该发送错误报告。

【讨论】:

以上是关于如何自动检测调色板与真彩色 png的主要内容,如果未能解决你的问题,请参考以下文章

教你用OpenCV人脸检测自动给头像戴圣诞帽(附代码)

SikuliX:我的脚本在检测图像时反应太慢,如何改进?

如何利用opencv实现彩色图像边缘检测算法

如何使用 OpenCV 检测彩色键盘上的文本?

自动检测AS3中输入文本字段的值

如何检测自动隐藏的任务栏是不是可见?