如何自动检测调色板与真彩色 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的主要内容,如果未能解决你的问题,请参考以下文章