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
これらの操作を他の操作と組み合わせて一括で実行しようとしているので、Image::Magickを使用して perl で同じ操作を実行しようとしています。いくつかの異なる方法を試しましたが、次の結果が得られました。
#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 プロセスの外側で fork が発生し、効率の問題が発生します。
このサイズ変更操作がコマンドライン変換ユーティリティと同じ結果を生成するようにするための perl のより良い方法はありますか?
私のコマンド ライン ユーティリティはバージョン 6.7.9-10 を報告し、Image::Magick はバージョン 6.79 を報告します。