画像サイズを変更する [その2] (サムネイル・拡大縮小)
サムネイルを作成するなど、画像を縮小・拡大したい。
画像の縦横比を考慮し、特定のサイズに収まるようにしたい。基本的にはその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
);
}
