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

发布于 2025-01-01 07:42:55 字数 606 浏览 0 评论 0原文

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

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

虽然以下代码生成真彩色图像:

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

但是,我想要的是进行某种自动检测:

对“8位颜色图 png”使用调色板,但对“8”使用真彩色-位/颜色 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";
}

As described in GD manual the following code always produces palette images:

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

While the following produces truecolor images:

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

However, what I want is to do some kind of auto detection:

Use palette for "8-bit colormap png" but use truecolor for "8-bit/color RGB png" files.

I expected this to be the default, but it is not.

I did not find a hint in libgd manual that this is possible. Would it be possible to extract this information from the data itself probably by manually reading the Information from the png header?

To make this more clear here is some code example which does not auto-detect anything:

#!/usr/bin/perl

use GD;

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白衬杉格子梦 2025-01-08 07:42:56

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

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

等。


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

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

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

It is probably possible to search the header of the file for what you want, but the results will probably be error prone.

Better to use a tool that can parse the header for you. A CPAN search reveals a few that might work well:

and others.


But from the GD docs, it seems like auto-detection is the default when the newFromPngData is only passed one argument:

Images created by reading PNG images will be truecolor if the image
file itself is truecolor. To force the image to be palette-based, pass
a value of 0 in the optional $truecolor argument.

If auto-detection is not working for you, you should verify that your source files are indeed what you think they are, and if GD is interpreting them wrong, perhaps you should send in a bug report.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文