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で返したほうが汎用的かな?ま、いいか。動けばいいし }