首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PerlMagick卡在ICO文件上?

PerlMagick卡在ICO文件上?
EN

Stack Overflow用户
提问于 2020-09-17 16:23:36
回答 1查看 155关注 0票数 2

我一直在编写一个从站点检索偏好脚本,它现在大部分都在工作,但我遇到了一个巨大的障碍。当我在Perl中调用ImageMagick模块时,它似乎不知道如何处理这个受人尊敬的favicon.ico文件(当一个站点有一个非ICO的图标时,一切都运行得很好)。我可以找到很多关于转换到ICO来创建一个图标的信息,但是关于从ICO转换的信息并不多。

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

代码语言:javascript
复制
    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转换时创建一个空白文件:

代码语言:javascript
复制
    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不会识别它。

更新:这是一个正在发生故障的链接到ico文件之一。然而,我尝试过的所有ico文件都是错误的。

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

代码语言:javascript
复制
[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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-17 22:38:14

基于@MarkSetchell的评论,我可以添加代码来处理上面列出的问题。我一直依赖PerlMagick的ping函数来确定文件类型,希望避免来自我连接的服务器的可能的坏信息。我现在所做的是检查内容类型标头,如果ImageMagick不能确定文件类型并在$format中返回它。

代码语言:javascript
复制
        if ((! $format) and (($mech->content_type() eq "image/x-icon") or ($mech->content_type() eq "image/vnd.microsoft.icon"))) {
            $format = "ICO";
        }

然后,在给ImageMagick文件blob之前,我将ICO格式手动传递给它:

代码语言:javascript
复制
        my %imParam;
        %imParam = ( 'magick' => 'ico' ) if ($params->{'format'} eq "ICO");
        my $image = Image::Magick->new( %imParam );

到目前为止,这似乎是可行的。谢天谢地,在GIF、PNG、SVG和JPEG上,ImageMagick自己工作得很好,这甚至更好,因为我宁愿信任ImageMagick,也不愿信任远程服务器的头。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63942295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档