#! /usr/bin/perl -- #加算合成サンプル use GD; &decode; #元画像 $png_image = "nikukyu.png"; #合成色 $color=$in{"color"}; #ここから処理 $image = new GD::Image(120,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,38,5,"+",$black); $image->string(gdGiantFont,75,5,"=",$black); $color =~ s/\#//ig; @color = split(//,$color); $color_r = hex($color[0] . $color[1]); $color_g = hex($color[2] . $color[3]); $color_b = hex($color[4] . $color[5]); $draw_color = $image->colorAllocate($color_r,$color_g,$color_b); $image->filledRectangle(50,2,70,22,$draw_color); $image = &image_multi_comp($png_image, 85, 2, $color, $image); $black = $image->colorAllocate(0,0,0); # 絵の周りを縁取り ($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; sub image_multi_comp{ #引数 my $image2 = $_[0]; my $start_x = $_[1]; my $start_y = $_[2]; my $color = $_[3]; my $image = $_[4]; #変数定義・・・というか、何使ってるか把握するため列挙 my $image_width; my $image_height; my $image2_width; my $image2_height; my $image2_new; my $temp_image; my $color_r; my $color_g; my $color_b; my @color; my $r; my $g; my $b; my $draw_color; #色デコード $color =~ s/\#//ig; @color = split(//,$color); $color_r = hex($color[0] . $color[1]); $color_g = hex($color[2] . $color[3]); $color_b = hex($color[4] . $color[5]); ####描画ここから #画像読み込み、サイズ取得 $image2_new = newFromPng GD::Image($image2); ($image2_width,$image2_height) = $image2_new->getBounds() ; #一時描画用の絵を用意(カラーパレットの問題で直接ドットを描けない) $temp_image = new GD::Image(1,1); #各ドットの処理に入る for(my $i=0;$i<$image2_width;++$i){ for(my $j=0;$j<$image2_height;++$j){ #色取得 ($r,$g,$b) = $image2_new->rgb($image2_new->getPixel($i,$j)); ########乗算部######## $r=$r*$color_r/255; $g=$g*$color_g/255; $b=$b*$color_b/255; ########減算部終了#### #一時描画用キャンパスに描いてみる $draw_color = $temp_image->colorAllocate($r,$g,$b); $temp_image->setPixel(1,1,$draw_color) ; #で、コピー $image->copy($temp_image,$start_x+$i,$start_y+$j,1,1,1,1); #いちいち開放しないと色数足りない(ノω;) $temp_image->colorDeallocate($draw_color); } } ####描画ココまで return $image; } #----------------# # デコード処理 # #----------------# sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("ちょっとデータ大きすぎですよ^^;"); }#あ、errorサブルーチンどっかやっちゃった read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } }