Imagerで画像を加工して、斜めに20℃傾けてみました。

もと画像はこちら

use Imager;

# 写真の読み込み
my $photo = new Imager;
$photo->read(file => $photo_file) or die $photo->errstr;

# 写真を傾ける
$photo = $photo->rotate( degrees => 20 );

# キャンバスとなるオブジェクト
my $canvas = new Imager( xsize => 300, ysize => 350, channels => 4 );

# 写真のリサイズ
$photo = $photo->scale(
    xpixels => 300,
    ypixels => 300,
);

# キャンバスに写真を貼り付け
$canvas->paste(
    src  => $photo,
    left  => 0,
    top  => 0,
);

# PNGで書き出し
$canvas->write(file=> './result.png', type=> 'png') or die;

上記コードを実行するとこうなります。

斜めにはなるんですが、四隅が黒くなってしまいました。
透明にするにはアルファチャンネルを有効にしてあげれば良いはずなので、

channel => 4に設定してあげればいいんですが。

略

# 写真の読み込み
my $photo = new Imager;
$photo->read(file => $photo_file) or die $photo->errstr;

# 写真を傾ける
$photo = $photo->rotate( degrees => 20, back => [0,0,0,255] );
$photo->img_set( channel => 4 );

略

実行結果はこうなります
背景はあえて不透明にしてあります(白にすればよかった・・)

なぜか写真が透明になってしまいました・・・
なぜかと言うと元の写真にアルファチャンネルが設定されていないからで、

アルファチャンネルが0(透明)に設定されてしまうせいでした。

これを回避するためにImagerにはconvertというメソッドがあります。

略

# 写真の読み込み
my $photo = new Imager;
$photo->read(file => $photo_file) or die $photo->errstr;

# 写真を傾ける
$photo = $photo->convert( preset => 'addalpha');
$photo = $photo->rotate( degrees => 20, back => [0,0,0,0]);

略

結果はこのとおり

思いどうりになりました。
Imagerは色々画像を加工するメソッドが用意されていていいですね。