Image::Magick で画像のリサイズをする方法


Perl モジュール Image::Magick を使って CGI プログラム内でアップロードされた画像をリサイズ(拡大/縮小)する方法の紹介です。
ImageMagick 側にサイズ指定のオプションが色々あります。

画像の自動リサイズ機能付きCGIを探しているという方はこちらをどうぞ
「すぐ使えるCGI 添付ファイル付 ウェブページ更新ツール 大容量版」

これはシリーズ記事「Image::Magick の使い方」の 2/8 番目です。 目次を表示

Image::Magick での画像拡大/縮小方法

画像リサイズの目的で一番多いのは大きすぎる画像を縮小する事(a)ではないかと思いますが、それ以外のリサイズ設定についてもいくつか紹介します。

  1. 大きい画像を縮小
  2. 小さい画像を拡大
  3. 指定サイズになるように拡大または縮小(縦横比は保つ)
  4. 指定サイズになるように拡大または縮小(縦横比を変えて収める)

指定サイズより画像が大きかったら縮小

元画像が希望のサイズより大きかった場合のみ縮小する方法です。サイズは「(幅)x(高さ)」で指定しますが、指定の末尾に「>」を付けるのがポイントです。
この方法だと元画像の縦横のどちらかが指定を超えていた場合のみ縮小され、指定サイズより小さければリサイズされません。

Image::Magick サンプルコード:指定サイズより画像が大きかったら縮小

my $resized;
eval{
$resized = $img->Clone();
$ret = $resized->Resize(geometry => “160×160>“);
};
if ($ret||$@) {
print “リサイズに失敗しました。: $ret $@\n”;
exit;
}
$saved{resized} = “$dir/resized$ext”;
eval{$resized->Write($saved{resized_resized})};
if ($ret||$@) {
print “リサイズした画像の保存に失敗しました。: $ret $@\n”;
exit;
}
Image::Magickの使い方サンプルコード元画像

元画像 200x150

Image::Magickで縮小した画像

縮小した画像 160x120

指定サイズより画像が小さかったら拡大

希望サイズより元画像が小さかった場合に拡大を行うには、指定の末尾に「<」を付けます。
この設定だと、元画像の縦横の両方が指定サイズより小さければどちらかが指定サイズに達するまで拡大します。元画像が指定サイズより大きければリサイズされません。

Image::Magick サンプルコード:指定サイズより画像が小さかったら拡大

$resized->Resize(geometry => ‘300×300<‘);
Image::Magickの使い方サンプルコード元画像

元画像 200x150

Image::Magickでサイズを指定してリサイズ(小さければ拡大)

サイズを指定してリサイズ: 小さかったので拡大された

指定サイズになるように拡大または縮小

画像の長辺が指定したサイズの枠に収まるように画像をリサイズする設定です。
画像が小さければ拡大、大きければ縮小されます。

Image::Magick サンプルコード:指定サイズになるように拡大または縮小

この場合は、サイズ指定の後には何も付けません。この指定は上の2つを両方同時に指定したのと同等です。

$resized->Resize(geometry => ‘300×300‘);

指定サイズになるように拡大または縮小(縦横比を変えて収める)

元の画像の縦横比を変えて指定サイズに変換したい場合はサイズ指定の末尾に「!」を付けます。

Image::Magick サンプルコード:指定サイズになるように拡大または縮小(縦横比変更)

$resized->Resize(geometry => ‘160×160!‘);

なおこの指定は、以下のように width と height を個別に指定するのと同等です。

$resized->Resize(width => 160, height => 160);
Image::Magickの使い方サンプルコード元画像

元画像 200x150

指定したサイズにリサイズした画像(縦横比変更)

指定したサイズにリサイズした画像(縦横比変更)

画像のアンシャープマスク

画像のリサイズをした後は、「アンシャープマスク」を掛けておくと、リサイズによりぼやけた画像が多少ピリッとします。
ただし、オリジナルサイズより拡大した画像については、ぼやけは解消できません。

Image::Magick サンプルコード:画像のアンシャープマスク

#リサイズ後、保存前にアンシャープマスクを掛ける
eval{$ret = $resized->UnsharpMask(
‘1.9×1.0+0.3+0’
);
};

設定値は画像ごとに設定するのが望ましいのですが、プログラムで処理する場合は個別に見ながらの設定ができませんので、この値はどんな画像でもそこそこきれいになる経験値です。

Image::Magickで縮小した画像(アンシャープマスクなし)

縮小後アンシャープマスクなし

Image::Magickでアンシャープマスクした画像

アンシャープマスク後の画像

画像のサイズ測定

リサイズ後の画像サイズを確認したい場合は以下のように取得します。

Image::Magick サンプルコード:画像のサイズ測定

my ($w, $h);
eval{($w,$h) = $resized->Get(
‘width’,
‘height’
)};