Imagerでサムネイルを生成する(短辺に合わせて)

普通にサムネを作るなら(Imagerでサムネイルを生成する(元画像の比率を維持))みたいな感じで、長辺に合わせて縮小すればいいと思うんですが、、
短辺に合わせて縮小したい時もあるよね?(ないかな?)
ってことで、やってみました。

use Imager;
 
my $file = '/tmp/face.png'
my $new_file = '/tmp/new_face.png';
 
my $img = Imager->new();
$img->read( file => $file ) or die; # 元の画像を読み込み
 
# 短辺に合わせて縮小
$img = $img->scale(
  xpixels => 300,
  ypixels => 200,
  type => 'max',
);
 
my $w = $img->getwidth(); # 横幅取得
my $h = $img->getheight(); # 高さ取得

if ( $w > 300 ) {
    my $cut_size = int( ( $w - 300 ) / 2 ); # はみ出している横幅
    my $newimg = $img->crop( left => $cut_size, right => $cut_size, width => 300 ); # 左右をカット
    $newimg->write( type => 'png', file => $new_file); # 保存
}
elsif ( $h > 200 ) {
    my $cut_size = int( ( $h - 200 ) / 2 ); # はみ出している高さ
    my $newimg = $img->crop( top => $cut_size, bottom => $cut_size, height => 200 ); # 上下をカット
    $newimg->write( type => 'png', file => $new_file); # 保存
}
else {
    # はみ出してない
    $img->write( type => 'png', file => $new_file ); # 保存
}

まず、scaleで”type => ‘max'”を指定します。
例えば、元画像が800×400の場合は、scaleした時点で、400×200となります(欲しい画像は、300×200なので、このままでは横がはみ出してるってことですね)

そこで、はみ出した部分をcropで切り取ります。

サムネの生成は縮小して足りない部分を塗りつぶしか、はみ出した部分をカットのどちらかできれば、変に画像が伸びたりしないんじゃないかなと。