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 関数を使用して処理してしまう方がおすすめです。