PerlMagick 扼杀 ICO 文件?
PerlMagick Chokes on ICO File?
我一直在编写一个 的脚本,现在大部分都可以使用,但我 运行 遇到了一个巨大的障碍。当我在 Perl 中调用 ImageMagick 模块时,它似乎不知道如何处理古老的 favicon.ico 文件(当站点具有非 ICO favicon 时一切正常)。我可以找到很多关于将 转换为 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.
根据@MarkSetchell 的评论,我可以添加代码来处理上述问题。我一直依赖 PerlMagick 的 ping
函数来确定文件类型,希望避免来自我连接的服务器的可能的错误信息。我现在所做的是检查 Content-type header 如果 ImageMagick 无法确定文件类型并且 return 它在 $format
中:
if ((! $format) and (($mech->content_type() eq "image/x-icon") or ($mech->content_type() eq "image/vnd.microsoft.icon"))) {
$format = "ICO";
}
然后我在给它文件 blob 之前手动将 ICO 格式传递给 ImageMagick:
my %imParam;
%imParam = ( 'magick' => 'ico' ) if ($params->{'format'} eq "ICO");
my $image = Image::Magick->new( %imParam );
到目前为止这似乎有效。值得庆幸的是,在 GIF、PNG、SVG 和 JPEG 上,ImageMagick 自身运行良好,甚至更好,因为我宁愿相信 ImageMagick 而不是远程服务器的 headers.
我一直在编写一个
检索到图标后,我使用 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.
根据@MarkSetchell 的评论,我可以添加代码来处理上述问题。我一直依赖 PerlMagick 的 ping
函数来确定文件类型,希望避免来自我连接的服务器的可能的错误信息。我现在所做的是检查 Content-type header 如果 ImageMagick 无法确定文件类型并且 return 它在 $format
中:
if ((! $format) and (($mech->content_type() eq "image/x-icon") or ($mech->content_type() eq "image/vnd.microsoft.icon"))) {
$format = "ICO";
}
然后我在给它文件 blob 之前手动将 ICO 格式传递给 ImageMagick:
my %imParam;
%imParam = ( 'magick' => 'ico' ) if ($params->{'format'} eq "ICO");
my $image = Image::Magick->new( %imParam );
到目前为止这似乎有效。值得庆幸的是,在 GIF、PNG、SVG 和 JPEG 上,ImageMagick 自身运行良好,甚至更好,因为我宁愿相信 ImageMagick 而不是远程服务器的 headers.