PerlMagick 对 ICO 文件感到窒息?

标签 perl imagemagick-convert perlmagick

我一直在编写一个脚本 retrieves favicons from sites ,现在大部分工作正常,但我遇到了巨大的障碍。当我在 Perl 中调用 ImageMagick 模块时,它似乎不知道如何处理古老的 favicon.ico 文件(当站点具有非 ICO favicon 时,一切都运行良好)。我可以找到很多有关将 ICO 转换为 ICO 以创建网站图标的信息,但关于从 ICO 转换的信息却很少。

在检索图标后,我使用 PerlMagick 的 ping 函数来确定我正在处理的文件类型(因此我不依赖于图标的服务器来准确报告):

    use Image::Magick;
    my $im = Image::Magick->new();
    my ($width, $height, $size, $format) = $im->Ping( $saveFile );

当文件是 ICO 文件时,$format 返回为空(我请求它的服务器将其报告为 image/x-icon)。我还有一个小子例程,可以为我下载的所有内容创建 JPEG 缩略图。它在非 ICO 文件上效果很好,但 ImageMagick 在从 ICO 转换时会创建一个空白文件:

    open my $file, $params->{'openFile'};
    my $imageData = do { local $/; <$file> };

    my $image = Image::Magick->new;
    $image->BlobToImage($imageData);
    $image->SetAttribute(quality => 80);
    $image->SetAttribute(compression => 'JPEG');
    $image->SetAttribute(geometry => $thumbnailWidth . "x" . $thumbnailHeight);
    $image->Thumbnail();

    my $thumbnailData = $image->ImageToBlob();


    open(my $file, '>', $params->{'saveFile'}) or die "Could not open file '" . $params->{'saveFile'} . "'.";
    print $file $thumbnailData;
    close $file;

我需要以某种方式引导 ImageMagick 识别该文件吗?我一直在保存下载的图标,并且初始文件是有效的 ICO,即使 ImageMagick 无法识别它。

更新:这是 link to one of the ico files那是在起作用。然而,我尝试过的所有 ico 文件都起作用了。

如果我尝试使用命令行 ImageMagick convert 工具,结果如下:

[root@local favicons]# convert 1299 1299-jpg.jpg
convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/564.
convert: no images defined `1299-jpg.jpg' @ error/convert.c/ConvertImageCommand/3235.

最佳答案

根据@MarkSetcell的评论,我可以添加代码来处理上面列出的问题。我一直依靠 PerlMagick 的 ping 函数来确定文件类型,希望避免来 self 连接的服务器可能出现的错误信息。我现在所做的是检查 Content-type header 如果 ImageMagick 无法确定文件类型并以 $format 返回它:

        if ((! $format) and (($mech->content_type() eq "image/x-icon") or ($mech->content_type() eq "image/vnd.microsoft.icon"))) {
            $format = "ICO";
        }

然后我手动将 ICO 格式传递给 ImageMagick,然后再将文件 blob 提供给 ImageMagick:

        my %imParam;
        %imParam = ( 'magick' => 'ico' ) if ($params->{'format'} eq "ICO");
        my $image = Image::Magick->new( %imParam );

到目前为止,这似乎有效。值得庆幸的是,在 GIF、PNG、SVG 和 JPEG 上,ImageMagick 本身工作得很好,甚至更好,因为我宁愿相信 ImageMagick 而不是远程服务器的 header 。

关于PerlMagick 对 ICO 文件感到窒息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63942295/

相关文章:

perl -\& 和 $expr->() 的用法是什么

perl - 当推送到我的 perl Moo 类中的 ArrayOf[] 成员时,如何检查对象是否有效?

imagemagick - 为什么我的 ImageMagick 执行的调色结果与预期不同?

ffmpeg - 支持转换器的多种文件格式如何工作?

perlmagick imagemagick 错误

regex - sed 正则表达式及其替代方案在 Solaris 上不起作用

perl - 如何确定 Java 进程是否在 Perl 中运行

linux - 将多个 PDF 文档转换为多个图像文件

perl - 将 Alpha channel 添加到使用 PerlMagick 读取的图像中

perl - 使用 ImageMagick 时出现问题 - 通过 Homebrew 安装