#! /usr/bin/perl -- #加算合成サンプル use GD; #元画像 $png_image = "kuroneko.png"; $png_image2 = "nikukyu2.png"; #ここから処理 $image = new GD::Image(150,25); $white = $image->colorAllocate(255,255,255); $black = $image->colorAllocate(0,0,0); $image2 = newFromPng GD::Image($png_image); ($image2_width,$image2_height) = $image2->getBounds() ; $image->copy($image2,10,2,0,0,$image2_width,$image2_height); $image->string(gdGiantFont,45,5,"+",$black); $image3 = newFromPng GD::Image($png_image2); ($image3_width,$image3_height) = $image3->getBounds() ; $image->copy($image3,58,2,0,0,$image3_width,$image3_height); $image->copy($image3,110,2,0,0,$image3_width,$image3_height); $image->string(gdGiantFont,90,5,"=",$black); $image = &image_tranparent_comp($png_image, 105, 2, $image); # 絵の周りを縁取り ($width,$height) = $image->getBounds() ; $image->rectangle(0,0,$width-1,$height-1,$black); #Context-typeではない(謎 print "Content-type:image/png\n\n"; # バイナリ・ストリームへ書きこむことを確実にする binmode STDOUT; # イメージをPNGに変換し、標準出力に出力 print $image->png; #perl+GDで背景色(左上の色)を透過しつつ画像を合成 sub image_tranparent_comp{ #引数 my $image2 = $_[0]; my $start_x = $_[1]; my $start_y = $_[2]; my $image = $_[3]; #変数定義・・・というか、何使ってるか把握するため列挙 my $image2_width; my $image2_height; my $image2_new; my $temp_image; my $transparent; ####描画ここから #画像読み込み、サイズ取得 $image2_new = newFromPng GD::Image($image2); ($image2_width,$image2_height) = $image2_new->getBounds() ; #一時描画用の絵を用意(カラーパレットの問題で直接ドットを描けない) $temp_image = new GD::Image(1,1); #左上のドットを透過色指定 $transparent = $image2_new->getPixel(0,0); #各ドットの処理に入る for(my $i=0;$i<$image2_width;++$i){ for(my $j=0;$j<$image2_height;++$j){ if($transparent ne $image2_new->getPixel($i,$j)){ #コピー $image->copy($image2_new,$start_x+$i,$start_y+$j,$i,$j,1,1); } } } return $image; }