我正在使用ImageMagick的Perl创建缩略图。我正在使用关于ImageMagick 图像优化从上一个这样的问题的建议
open my $file, $params->{'openFile'};
my $imageData = do { local $/; <$file> };
if ($params->{'size'} eq "largesized") {
$thumbnailWidth = 1000;
$thumbnailHeight = 1000;
}
$image->BlobToImage($imageData);
$image->SetAttribute('quality' => 80);
$image->SetAttribute('compression' => 'JPEG');
$image->SetAttribute('sampling-factor' => '4:2:0');
$image->SetAttribute('interlace' => 'Plane');
$image->SetAttribute('gaussian-blur' => '0.05');
$image->Thumbnail('geometry' => $thumbnailWidth . "x" . $thumbnailHeight);
my $thumbnailData = $image->ImageToBlob();
open(my $file, '>', $params->{'saveFile'}) or return { 'thumbnailGenerated' => 0, error => "Could not open file '" . $params->{'saveFile'} . "'." };
print $file $thumbnailData;
close $file;据我所知,这应该会创建一个优化的缩略图。然而,尽管输入图像为3088x2320,重量为1.6MB,产生的缩略图在1000x1000实际上更大,只有2.3MB(对于那样的产生的缩略图在1000x1000来说,这似乎是相当大的)。注意:在示例中,它被裁剪了一点,因为上传图像的JavaScript强制一个人按设计选择1:1的裁剪。
我正在运行ImageMagick 6.9.10-68 Q16 x86_64 2021-10-14 (CentOS)。命令行等价物产生的图像比预期的要小(84 as ):
convert -thumbnail 1000x1000 -quality 80 -compress JPEG -sampling-factor 4:2:0 -interlace Plane -gaussian-blur 0.05 imageMagickSampleImage.jpg imageMagickSampleImage3.jpg这让我想知道SetAttribute属性是否没有传递给Thumbnail函数或其他什么东西。我发现PerlMagick在各个方面都不太完美,我一直在想,我是否只需要使用GD。
我注意到缩略图仍然太大(并且比命令行大),但是如果删除所有"SetAttribute“行,缩略图就会变小。1000x1000缩略图的输出从2.4MB到976 to。这仍然比具有相同属性集的命令行大10倍以上。
我认为直接将一些属性移到ImageToBlob方法可能会有帮助,但它似乎根本改变不了结果。以下是这一尝试:
my $thumbnailData = $image->ImageToBlob('quality' => 40, 'compression' => 'JPEG', 'sampling-factor' => '4:2:0', 'interlace' => 'Plane', 'gaussian-blur' => '0.05');发布于 2022-06-26 01:15:55
问题显然是,尽管指定了JPEG压缩并输入了JPEG,但是ImageToBlob方法输出了一个PNG文件,正如@MarkSetchell在上面的注释中所观察到的那样。
来自https://www.oreilly.com/library/view/perl-graphics-programming/9781449358280/re70.html的一个有用的代码片段提供了解决方案。我相应地修改了代码,专门告诉ImageMagick输出JPEG:
my $thumbnailData = $image->ImageToBlob(magick => 'jpeg');1000x1000的图形从以前的庞大尺寸发展到了167 to。
https://stackoverflow.com/questions/72747319
复制相似问题