Imagerでサムネイルを生成する(元画像の比率を維持)

いつもぐぐるので、メモ程度に。
Perlでサムネ画像を生成します。

元画像の比率は維持しつつ、生成された画像の縦横は指定したサイズです。
(比率が違う場合は、黒で塗りつぶし)

use Imager;

my $file = '/tmp/face.png'
my $new_file = '/tmp/new_face.png';

my $img = Imager->new();
$img->read( file => $file ) or die; # 元の画像を読み込み

# 300x200以内に収まるように縮小
$img = $img->scale(
  xpixels => 300,
  ypixels => 200,
  type => 'min',
);

my $w = $img->getwidth(); # 横幅取得
my $h = $img->getheight(); # 高さ取得
my $x = ($w != 300) ? int((300-$w) / 2) : 0; # 中央に寄せる為に横へずらす幅
my $y = ($h != 200) ? int((200-$h) / 2) : 0; # 中央に寄せる為に縦へずらす高さ

my $img2 = Imager->new(xsize => 300, ysize => 200); # 背景となる画像を生成
$img2->box( filled=>1, color=>'#000000'); # 黒で塗りつぶし
$img2->paste( left => $x, top => $y, img => $img ); # 中央位置に縮小した画像を貼り付け
$img2->write( type => 'png', file => $new_file ); # pngで保存

これで、中央位置に元画像が張り付いた画像が保存されたはずです。
あまりなさそうですが、単純に、縦横サイズを小さくしたい場合は、背景を用意する必要がないので、縮小だけして保存すればよろしいかと。