我正在尝试使用 ImageMagick 和 perlmagick (Image::Magick) 对图像进行一些批量调整大小操作。我作为源的所有图像都是大图像,我想将它们调整为不同的间隔或高度或宽度。我想始终保持纵横比。
给定一个尺寸为 3840 像素 × 2160 像素 (3840x2160) 的示例图像,我想创建以下调整大小的图像:
?x1000
?x500
?x100
1600x?
1200x?
800x?
400x?
我可以通过以下命令(按顺序)使用convert命令行实用程序非常简单地做到这一点:
convert input_filename.jpg -resize x1000 output_wx1000.jpg
convert input_filename.jpg -resize x500 output_wx500.jpg
convert input_filename.jpg -resize x100 output_wx100.jpg
convert input_filename.jpg -resize 1600 output_1600xh.jpg
convert input_filename.jpg -resize 1200 output_1200xh.jpg
convert input_filename.jpg -resize 800 output_800xh.jpg
convert input_filename.jpg -resize 400 output_400xh.jpg
由于我试图与其他操作一起批量执行这些操作,因此我试图在 perl 中使用Image::Magick执行这些相同的操作。我尝试了几种不同的方法,结果如下:
#METHOD 1
my $image = Image::Magick->new();
$image->Read($input_filename);
$image->Resize(
($width ? ('width' => $width) : ()),
($height ? ('height' => $height) : ()),
);
$image->Write(filename => $output_filename);
这会导致图像不保持纵横比。例如,如果提供 100 的高度,则输出图像将是原始宽度乘以 100 (3840x100)。提供宽度时会产生类似的效果——保持高度,但不保持纵横比。
#METHOD 2
my $image = Image::Magick->new();
$image->Read($input_filename);
die "Only one dimension can be supplied" if $width && $height;
$image->Resize(geometry => $width) if $width;
$image->Resize(geometry => "x$height") if $height;
$image->Write(filename => $output_filename);
这导致图像保持纵横比,如果几何操作基于高度,则输出正是预期的。但是,如果提供了宽度,则输出非常模糊。
#METHOD 3
`convert "$input_filename" -resize $width "$output_filename"` if $width;
`convert "$input_filename" -resize x$height "$output_filename"` if $height;
这导致图像都是正确的,但在 perl 进程之外分叉会导致效率问题。
perl 中是否有更好的方法来使此调整大小操作产生与命令行转换实用程序相同的结果?
我的命令行实用程序报告版本 6.7.9-10,Image::Magick 报告版本 6.79。