微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PerlMagick在ICO文件上被扼杀了吗?

如何解决PerlMagick在ICO文件上被扼杀了吗?

我一直在研究retrieves favicons from sites的脚本,该脚本现在大部分都可以使用,但是遇到了一个巨大的障碍。当我在Perl中调用ImageMagick模块时,它似乎不知道如何处理古老的favicon.ico文件(当站点具有非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文件,但是从ICO转换时ImageMagick会创建一个空白文件

    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识别文件吗?我一直保存着我下载的图标,即使ImageMagick无法识别它,初始文件也是有效的ICO。

更新:这是一个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.

解决方法

基于@MarkSetchell的评论,我可以添加代码来解决上述问题。我一直依靠PerlMagick的ping函数来确定文件类型,希望避免可能从我连接的服务器获取错误信息。我现在要做的是检查Content-type标头 如果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:

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

到目前为止,这似乎一直有效。值得庆幸的是,在GIF,PNG,SVG和JPEG上,ImageMagick可以很好地工作,这甚至更好,因为我宁愿信任ImageMagick而不是远程服务器的标头。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。