C@atmarkMailふぁいなるヴぁーじょん

キリがないからもうこれで完成!最後にしたことは、背景のにくきゅーとか猫とかを任意の色に対応させたってとこらへんです。
当たり前ですけど頑張ればGDでもいろんな合成できるのですねぃ。やべー、こんなに作りこむつもりなかったのに、暇の力ってすごい!(ぇ
折角なので、合成サブルーチンを張ってみるテスト。やり方よくわからないので力技ですw。カラーパレットが曲者です。(ちなみに、マージ関数は用意されてるっぽいです)

#perl+GDで背景色(左上の色)を透過しつつ特定の色と画像を加算合成
#最終的に出力するキャンバスはグローバルで$image2になってます
sub image_draw{
#引数
my $image_png = $_[0];
my $start_width = $_[1];
my $start_height = $_[2];
my $image_color = $_[3];#16進で入ってくる

#変数定義・・・というか、何使ってるか把握するため列挙
my $image_png_width;
my $image_png_height;
my $image_gd;
my $image_gd2;
my $transparent;
my $image_color_r;
my $image_color_g;
my $image_color_b;
my @color;
my $r; my $g; my $b;

#色デコード
$image_color =~ s/\#//ig;
@color = split(//,$image_color);
$image_color_r = hex($color[0] . $color[1]);
$image_color_g = hex($color[2] . $color[3]);
$image_color_b = hex($color[4] . $color[5]);

####描画ここから
 #画像読み込み、サイズ取得
 $image_gd = newFromPng GD::Image($image_png);
 ($image_png_width,$image_png_height) = $image_gd->getBounds() ;
 #一時描画用の絵を用意(カラーパレットの問題で直接ドットを描けない)
 $image_gd2 = new GD::Image($image_png_width,$image_png_height);
 
 #左上のドットを透過色指定 
 $transparent = $image_gd->getPixel(0,0);
 
 #各ドットの処理に入る
 for($i=0;$i<$image_png_width;++$i){
  for($j=0;$j<$image_png_height;++$j){
   if($transparent ne $image_gd->getPixel($i,$j)){
    #色取得
    ($r,$g,$b) = $image_gd->rgb($image_gd->getPixel($i,$j));
    
    #足し算する。ここを変えれば減算、乗算、除算でも何でもいいと思う。
    if($r+$image_color_r > 255){
     $r = 255;
    }else{
     $r = $r+$image_color_r;
    }
    if($g+$image_color_g > 255){
     $g = 255;
    }else{
     $g = $g+$image_color_g;
    }
    if($b+$image_color_b > 255){
     $b = 255;
    }else{
     $b = $b+$image_color_b;
    }
    #一時描画用キャンパスに描いてみる
    $draw_color = $image_gd2->colorAllocate($r,$g,$b);
    $image_gd2->setPixel($i,$j,$draw_color) ;
    #で、コピー
    $image2->copy($image_gd2,$start_width+$i,$start_height+$j,$i,$j,1,1);
    #いちいち開放しないとやっぱり色数足りない(ノω;)
    $image_gd2->colorDeallocate($draw_color);
   }
  }
 }
####描画ココまで
#$image2も引数にしてreturnで返したほうが汎用的かな?ま、いいか。動けばいいし
}