Perl モジュール Image::Magick で画像を切り抜く方法

Perl の Image::Magick モジュールを使用してGIF画像を切り抜く方法を紹介します。

サンプルコード

use Image::Magick;
my ($image, %info);

$image = Image::Magick->new;

# イメージの読み込み
$image->Read('myimage.gif');

# 背景色しかない部分を切り落とす
$image->Trim();

# この他の切り抜き関数としては、座標を数値で指定するCropがあります。
# 下の2つの指定はどちらも同じ結果になります。
# $image->Crop(width=>26, height=>26, x=>287, y=>251);
# $image->Crop(geometry=>"26×26+287+251");

# この下の2行がミソ
# Image::Magick 内では切り抜き後の画像のサイズを
# 画像のサイズとして保持していますが、Set 関数で page を以下のように
# 指定しないと、書き出されるファイルに切り落としたはずの部分が
# 入ってしまいます。
@info{'width', 'height'} = $image->Get('width', 'height');
$image->Set(page=>"$info{width}x$info{height}+0+0");

# ファイルの書き出し
$image->Write('resized.gif');

補足

ImageMagick のドキュメントには Crop 関数だけで期待どおり切り抜ける、と記載されていますが、GIF を作業対象にしたところ、前処理が Crop だけでは Write に size を設定しても期待通りの結果にはなりませんでした。

動作確認環境

OS: FreeBSD 4.1-Release
perl: 5.6.1
ImageMagick: 6.1.5
Image::Magick: 6.1.5

その他のTIPS

perl のモジュール Image::Magick を通すより、ImageMagick のコマンドラインプログラムを使用した方が高速で、問題が少ないようです。
コマンドラインプログラムで可能な処理であれば、perl からは system 関数を使用して処理してしまう方がおすすめです。