画像サイズを変更する(サムネイル作成・拡大縮小) その2 - Perl,ImageMagick

サムネイルを作成するなど、画像を縮小・拡大したい。

画像の縦横比を考慮し、特定のサイズに収まるようにしたい。基本的にはその1で紹介したやり方で、width,heightの値の計算をちょちょいと工夫してやればよい。

めんどくさい事はどうでも良いという人は、miniMize関数(サブルーチン)をコピペして利用すれば良い。

サンプル

;#
;#指定サイズ以下にする(縦横比を考慮)
;#

use Image::Magick;

#-- 最終的な縦横サイズ --#
my $max_width  = 320;
my $max_height = 250;

#-- オブジェクト作成 --#
my $image = Image::Magick->new;

#-- 画像を読込む --#
$image->Read('./image.jpg');

#-- 現在のサイズから縮小サイズを求める --#
my ($now_width, $now_height) = $image->Get('width', 'height');
my ($width, $height) 
                    = miniMize(
                          $now_width     #現在の横幅
                        , $now_height    #現在の高さ
                        , $max_width     #最大の横幅
                        , $max_height ); #最大の高さ

#-- 縮小/拡大 --#
$image->Resize(
          width  => $width
        , height => $height
        , blur   => 0.8
);

#-- 画像を保存する(JPEG) --#
$image->Write('./image_s.jpg');

#------------------------------------------------
#はみ出し調整
#------------------------------------------------
sub miniMize{
    my $x     = shift;
    my $y     = shift;
    my $max_x = shift;
    my $max_y = shift;


    #-- 比率を計算 --#
    my $x_hi  = _min($x, $max_x) / _max($x, $max_x);
    my $y_hi  = _min($y, $max_y) / _max($y, $max_y);

    #-- 比率の小さな方で計算して返す --#
    if( $x_hi > $y_hi ){
        return( (($x * $y_hi), ($y * $y_hi)) );
    }
    else{
        return( (($x * $x_hi), ($y * $x_hi)) );
    }

}

#------------------------------------------------
#大きな値を返す
#------------------------------------------------
sub _max{
    my $a = shift;
    my $b = shift;

    return(
        ($a > $b)?  $a:$b
    );
}


#------------------------------------------------
#小さな値を返す
#------------------------------------------------
sub _min{
    my $a = shift;
    my $b = shift;

    return(
        ($a < $b)?  $a:$b
    );
}