2

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 を報告します。

4

2 に答える 2

2

あなたの方法#2は正しい軌道に乗っています。縦横比を維持するには、geometryキーワードで幅と高さを指定します。サイズ変更を 2 回ではなく 1 回の呼び出しで実行することにより、手順をより一般的にすることができます。

$image->Resize(geometry => "${width}x${height}");

これにより、$width と $height の両方を指定した場合でも、Resize が 1 回だけ呼び出されることが保証されます。いずれかの値が指定されていない場合は、空の文字列に設定してください。方法 2 の手順に幅と高さの両方を指定した場合、それがぼやけの原因である可能性があります。

ぼやけのもう 1 つの原因は、サイズ変更演算子で使用されるフィルターです。特定の操作に使用する最適なフィルターは、イメージの色特性と、元のサイズとターゲットのサイズの関係の両方によって異なります。それに関する情報については、http://www.imagemagick.org/script/command-line-options.php#filterを読むことをお勧めします。PerlMagick では、Resize が使用するフィルターをキーワードで指定できますfilter

とはいえ、試した画像では特にぼやけの問題は見られなかったので、問題が解決しない場合はテスト画像が最も役立ちます.

于 2014-03-11T17:32:26.760 に答える