【Perl】アルファブレンディング【画像処理】

ボクセル化が面白そうだと思ったんだけど、
上手く実装できなかったので変更しました。。。orz

さて、アルファブレンディング
「αブレンド(アルファブレンド)とは、2つの画像を係数(α値)により合成すること。特にゲームの開発に必須の技術で、別々に描かれた背景とキャラクターとを合成するのに使われる」
とwikipedaには書かれています。
というわけで。
use strict;
use warnings;
use Imager;
use Image::Size;

my $alpha = 0.5;
my $read_img1 = Imager->new;
my $read_img2 = Imager->new;
my ($max_width, $max_heigth) = imgsize('Perfume1.png');
my $set_img = Imager->new(xsize => $max_width, ysize => $max_heigth, channels => 4);
$read_img1->read(file => 'Perfume1.png') or die $read_img1->errstr;
$read_img2->read(file => 'Perfume2.png') or die $read_img2->errstr;
for my $x (1..$max_width - 1) {
    for my $y (1..$max_heigth - 1) {
        my $img1_color = $read_img1->getpixel(x => $x, y => $y);
        my $img2_color = $read_img2->getpixel(x => $x, y => $y);
       
        my ($img1_red, $img1_green, $img1_blue, $img1_alpha) = $img1_color->rgba();
        my ($img2_red, $img2_green, $img2_blue, $img2_alpha) = $img2_color->rgba();

        my $set_red = $img1_red * $alpha + $img2_red * (1 - $alpha);
        my $set_green = $img1_green * $alpha + $img2_green * (1 - $alpha);
        my $set_blue = $img1_blue * $alpha + $img2_blue * (1 - $alpha);
       
        my $set_color = Imager::Color->new($set_red, $set_green, $set_blue);
        $set_img->setpixel(x => $x, y => $y, color => $set_color);
    }
}

$set_img->write( file => 'save_test.png') or die $set_img->errstr;
■画像1
Perfume1












■画像2
Perfume2












■出力結果
save_test












$img1_color * $alpha + $img2_color * (1 - $alpha);
で係数(α値)を掛けて合成しています。
今回、係数を0.5とすることにより透明にして、2枚の画像を合成させています。

透明度の話をするとImagerから直接α値を突っ込むこともできるんですけどね。。。