‚±‚κ‚Ν‚Ώ‚ε[‘‚«“r’†‚Ε‚·iŠΎ@TOP‚Ι–ί‚ι
perl+GD.pm‚Ε—V‚Ϊ‚€τ

1.‚Ν‚Ά‚ί‚Ι

Ž„‚ΝƒvƒƒOƒ‰ƒ}[‚Ε‚Ν‚Θ‚’‚Ε‚·BuƒvƒƒOƒ‰ƒ~ƒ“ƒO‚Ε‚«‚ιv‚ΖŒΎ‚¦‚Ώ‚α‚€‚Ω‚Η‚Ε‚«‚ά‚Ή‚ρB ‚±‚ΜƒTƒCƒg‚ΜƒJƒEƒ“ƒ^‚βA–ΌŽhƒWƒFƒlƒŒ[ƒ^‚Ζ‚«‚α‚Α‚Ƃ܁[‚­‚߁[‚ι‚Ζ‚©μ‚Α‚½‚­‚η‚’‚Ε‚·B ‚»‚±‚η‚Φ‚ρ‚π‘O’ρ‚ɓǂݐi‚ί‚Δ‚­‚Ύ‚³‚’B ‚Ώ‚Ȃ݂ɁApush‚Ζpop‚Ζshift‚Ζunshift‚Ζ‚©‚ͺ‚Η‚κ‚ͺ‚Η‚κ‚Ύ‚©‚’‚Ώ‚’‚Ώ’²‚Χ‚Θ‚’‚Əo‚Δ‚±‚Θ‚’ƒŒƒxƒ‹‚Ε‚·B

2.‚±‚Μ•Ά‘‚ͺ‘ΏۂƂ΅‚Δ‚ιl

γ‹LŽ„‚̍μ‚Α‚½‚ζ‚€‚Θ‚ΰ‚Μ‚πAu‚β‚θ•ϋ‚ν‚©‚κ‚΍μ‚κ‚ι‚―‚Η’²‚Χ‚ι‚Μ‚ί‚ρ‚Η‚­‚³v‚Α‚ΔƒŒƒxƒ‹‚Ȑl GD‚ͺ“ό‚Α‚Δ‚ιƒT[ƒo‚πŽg‚¦‚ιl‚ΰ‚΅‚­‚ΝGD‚π“ό‚κ‚η‚κ‚ιl GD‚ΜƒŠƒtƒ@ƒŒƒ“ƒX‚Ζ‚©Œ©‚Δ‚ά‚ ‚ά‚ ‚ν‚©‚ιl @¨ŽQlFGD.pm - GdƒOƒ‰ƒtƒBƒbƒNƒXEƒ‰ƒCƒuƒ‰ƒŠ‚Φ‚ΜƒCƒ“ƒ^[ƒtƒF[ƒX ƒTƒuƒ‹[ƒ`ƒ“‚Ιˆψ”“n‚·‚β‚θ•ϋ‚ͺ‚ν‚©‚ιl ‚ί‚Ι‚€i‚ά‚Ύ‚ά‚ΎHŽ–’†j šƒŠƒtƒ@ƒŒƒ“ƒX‚Ι‚ΝGIF—pƒƒ\ƒbƒh‚ ‚ι‚ρ‚Ύ‚―‚ΗŽg‚¦‚Θ‚’‚ρ‚Ύ‚―‚ǁH š‡¬ƒTƒuƒ‹[ƒ`ƒ“ŒQ(image_comp_gd.pl) š‰ζ‘œ‚ƐF‚Μ‰ΑŽZ‡¬ š‰ζ‘œ‚ƐF‚ΜŒΈŽZ‡¬ š‰ζ‘œ‚ƐF‚̏ζŽZ‡¬ š‰ζ‘œ‚𓧉߂΅‚臐¬ šƒŠƒtƒ@ƒŒƒ“ƒX‚Ι‚ΝGIF—pƒƒ\ƒbƒh‚ ‚ι‚ρ‚Ύ‚―‚ΗŽg‚¦‚Θ‚’‚ρ‚Ύ‚―‚ǁH ’˜μŒ ‰]X‚ΕˆκŽžŠϊ‘›‚ͺ‚κ‚½‚Ζ‚«‚Ι‚«‚¦‚ά‚·‚½B‚Ζ‚θ‚ ‚¦‚ΈAlibgd 2.0.28ˆΘ~‚Ε‘Ξ‰ž‚΅‚½‚Ζ‚©‚»‚ρ‚Θ‚€‚ν‚³‚Ε‚· š‡¬ƒTƒuƒ‹[ƒ`ƒ“ŒQ(image_comp_gd.pl) ’u‚’‚Δ‚έ‚½‚Μ‚Εrequire“™‚ΕŒΔ‚Ρo‚΅‚ΔŽg‚Α‚Δ‚έ‚Δ‚­‚κ‚³‚’Biƒtƒ@ƒCƒ‹–Ό‚Νimage_comp_gd.pl‚Ι•Ο‚¦‚Δ‚­‚Ύ‚³‚’‚Ε‚·j ‚­‚θ‚Α‚­‚Θ‚€τ(ˆκŽž‚Δ‚’‚΅‚Ώ‚€τ) Žg‚’•ϋ‚Ν‰Ί‹LŽQΖ š‰ζ‘œ‚ƐF‚Μ‰ΑŽZ‡¬ ‚’‚λ‚ρ‚ȐF‚Μ‰ζ‘œ‚πŽg‚’‚½‚’‚Ζ‚«AŠeF‚Ι‚Β‚’‚Δ‰ζ‘œ‚πμ‚ι‚Μ‚Ν‘ε•ΟBBB‚Ζ‚’‚€‚±‚ƂŁA uƒ‚ƒmƒNƒ‰ζ‘œv‚πμ‚θA‚»‚κ‚ɐF‚π‰ΑŽZ‡¬‚·‚ι‚±‚Ζ‚Ε‹κ˜J‚·‚ι‚±‚Ζ‚Θ‚­—lX‚ȐF‚Μ‰ζ‘œ‚πŽg‚€‚±‚Ζ‚ͺ‚Ε‚«‚ά‚·B —Ⴆ‚΁A‚«‚α‚Α‚Ƃ܁[‚­‚߁[‚ι‚ΜƒfƒUƒCƒ“‚̐F‚βC@tmark‚̐F“™‚Ν‚»‚Μ•ϋ–@‚π—˜—p‚΅‚Δ‚’‚ά‚·B ˆΘ‰Ί‚Ι‚»‚ΜƒTƒuƒ‹[ƒ`ƒ“‚πŽ¦‚΅‚ά‚·B Žg‚’•ϋA$image‚ɁA$image2(ƒtƒ@ƒCƒ‹)‚Ζ$color‚π‡¬‚΅‚½‰ζ‘œ‚π“\‚θ•t‚― $image = &image_add_comp($image2, $start_x, $start_y, $color, $image); $image2:“\‚θ•t‚―ƒtƒ@ƒCƒ‹–ΌiƒpƒXj $start_x:xŽ²•`‰ζŠJŽn“_ $start_y:yŽ²•`‰ζŠJŽn“_ $color:‡¬F(16i”F—α#ffffff) $image:Ž©•ͺŽ©g‚π“n‚· •Τ‚θ’l:‡¬Œγ‚Μ$image
ƒTƒ“ƒvƒ‹i‚±‚ΜƒTƒ“ƒvƒ‹‚Μƒ\[ƒXj @F: F‚π‘I‚Τ @
@

#perl+GD‚Ε“Α’θ‚̐F‚Ζ‰ζ‘œ‚π‰ΑŽZ‡¬
sub image_add_comp{
 #ˆψ”
 my $image2 = $_[0];
 my $start_x = $_[1];
 my $start_y = $_[2];
 my $color = $_[3];
 my $image = $_[4];

 #•Ο”’θ‹`EEE‚Ζ‚’‚€‚©A‰½Žg‚Α‚Δ‚ι‚©”cˆ¬‚·‚ι‚½‚ί—ρ‹“
 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;

 #FƒfƒR[ƒh
 $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]);

 ####•`‰ζ‚±‚±‚©‚η
 #‰ζ‘œ“ǂݍž‚݁AƒTƒCƒYŽζ“Ύ
 $image2_new = newFromPng GD::Image($image2);
 ($image2_width,$image2_height) = $image2_new->getBounds() ;
 #ˆκŽž•`‰ζ—p‚ΜŠG‚π—pˆΣiƒJƒ‰[ƒpƒŒƒbƒg‚Μ–β‘θ‚Ε’ΌΪƒhƒbƒg‚π•`‚―‚Θ‚’j
 $temp_image = new GD::Image(1,1);
 
 #Šeƒhƒbƒg‚̏ˆ—‚Ι“ό‚ι
 for(my $i=0;$i<$image2_width;++$i){
  for(my $j=0;$j<$image2_height;++$j){
   #FŽζ“Ύ
   ($r,$g,$b) = $image2_new->rgb($image2_new->getPixel($i,$j));
   
   ########‰ΑŽZ•”########
   if($r+$color_r > 255){
    $r = 255;
   }else{
    $r = $r+$color_r;
   }
   if($g+$color_g > 255){
    $g = 255;
   }else{
    $g = $g+$color_g;
   }
   if($b+$color_b > 255){
    $b = 255;
   }else{
    $b = $b+$color_b;
   }
   ########‰ΑŽZ•”I—Ή####
   
   #ˆκŽž•`‰ζ—pƒLƒƒƒ“ƒpƒX‚Ι•`‚’‚Δ‚έ‚ι
   $draw_color = $temp_image->colorAllocate($r,$g,$b);
   $temp_image->setPixel(1,1,$draw_color) ;
   #‚ŁAƒRƒs[
   $image->copy($temp_image,$start_x+$i,$start_y+$j,1,1,1,1);
   #‚’‚Ώ‚’‚ΏŠJ•ϊ‚΅‚Θ‚’‚ƐF”‘«‚θ‚Θ‚’iƒmƒΦGj
   $temp_image->colorDeallocate($draw_color);
  }
 }
 ####•`‰ζƒRƒR‚ά‚Ε
 return $image;
}
š‰ζ‘œ‚ƐF‚ΜŒΈŽZ‡¬ ‰ΑŽZ‡¬‚Μƒ\[ƒX‚Μ‰ΑŽZ•”‚π’Pƒ‚ΙŒΈŽZ‚Ι‚·‚κ‚Ξ‚ζ‚’B‚±‚̏ꍇ‚́A‰ζ‘œ‚©‚ηF‚πŒΈŽZ‚·‚ι‚±‚Ζ‚πl‚¦‚ι $image = &image_sub_comp($image2, $start_x, $start_y, $color, $image);
ƒTƒ“ƒvƒ‹i‚±‚ΜƒTƒ“ƒvƒ‹‚Μƒ\[ƒXj @F: F‚π‘I‚Τ @
@

   ########ŒΈŽZ•”########
   if($r-$color_r < 0){
    $r = 0;
   }else{
    $r = $r-$color_r;
   }
   if($g-$color_g < 0){
    $g = 0;
   }else{
    $g = $g-$color_g;
   }
   if($b-$color_b < 0){
    $b = 0;
   }else{
    $b = $b+$color_b;
   }
   ########ŒΈŽZ•”I—Ή####
š‰ζ‘œ‚ƐF‚̏ζŽZ‡¬ ‰ΑŽZ‡¬‚Μƒ\[ƒX‚Μ‰ΑŽZ•”‚πζŽZ‚Ι‚·‚κ‚Ξ‚ζ‚’B‚ΰ‚Ώ‚λ‚ρA255‚ΕŠ„‚Α‚Đ³‹K‰»‚Ν‚·‚ιB ζŽZ‚̏ꍇ‚Ν255‚π‰z‚¦‚ι‚±‚Ζ‚Ν‚Θ‚’‚Μ‚Εif‚Ζ‚©‚ΝŽg‚ν‚Θ‚’‚Ε‚¨‚’‚Δ‚έ‚ιB $image = &image_multi_comp($image2, $start_x, $start_y, $color, $image);
ƒTƒ“ƒvƒ‹i‚±‚ΜƒTƒ“ƒvƒ‹‚Μƒ\[ƒXj @F: F‚π‘I‚Τ @
@

   ########ζŽZ•”########
   $r=$r*$color_r/255;
   $g=$g*$color_g/255;
   $b=$b*$color_b/255;
   ########ζŽZ•”I—Ή####
š‰ζ‘œ‚𓧉߂΅‚臐¬ Žg‚’•ϋA$image‚ɁA$image2(ƒtƒ@ƒCƒ‹)‚̍Άγƒhƒbƒg‚Ζ“―‚ΆF‚𓧉߂΅‚臐¬ $image = &image_transparent_comp($image2, $start_x, $start_y, $image); $image2:“\‚θ•t‚―ƒtƒ@ƒCƒ‹–ΌiƒpƒXj $start_x:xŽ²•`‰ζŠJŽn“_ $start_y:yŽ²•`‰ζŠJŽn“_ $image:Ž©•ͺŽ©g‚π“n‚· •Τ‚θ’l:‡¬Œγ‚Μ$image ƒTƒ“ƒvƒ‹i‚±‚ΜƒTƒ“ƒvƒ‹‚Μƒ\[ƒXj
#perl+GD‚Ε”wŒiFiΆγ‚̐Fj‚𓧉߂΅‚Β‚Β‰ζ‘œ‚π‡¬
sub image_tranparent_comp{
#ˆψ”
my $image2 = $_[0];
my $start_x = $_[1];
my $start_y = $_[2];
my $image = $_[3];

#•Ο”’θ‹`EEE‚Ζ‚’‚€‚©A‰½Žg‚Α‚Δ‚ι‚©”cˆ¬‚·‚ι‚½‚ί—ρ‹“
my $image2_width;
my $image2_height;
my $image2_new;
my $temp_image;
my $transparent;

####•`‰ζ‚±‚±‚©‚η
 #‰ζ‘œ“ǂݍž‚݁AƒTƒCƒYŽζ“Ύ
 $image2_new = newFromPng GD::Image($image2);
 ($image2_width,$image2_height) = $image2_new->getBounds() ;
 #ˆκŽž•`‰ζ—p‚ΜŠG‚π—pˆΣiƒJƒ‰[ƒpƒŒƒbƒg‚Μ–β‘θ‚Ε’ΌΪƒhƒbƒg‚π•`‚―‚Θ‚’j
 $temp_image = new GD::Image(1,1);
 
 #Άγ‚Μƒhƒbƒg‚𓧉ߐFŽw’θ 
 $transparent = $image2_new->getPixel(0,0);
 
 #Šeƒhƒbƒg‚̏ˆ—‚Ι“ό‚ι
 for(my $i=0;$i<$image2_width;++$i){
  for(my $j=0;$j<$image2_height;++$j){
   if($transparent ne $image2_new->getPixel($i,$j)){
    #ƒRƒs[
    $image->copy($image2_new,$start_x+$i,$start_y+$j,$i,$j,1,1);
   }
  }
 }
 return $image;
}
šƒlƒKƒ|ƒV Žg‚’•ϋF$image‚πƒlƒKƒ|ƒW‚·‚ι $image = &image_negaposi($image); $image:Ž©•ͺŽ©g‚π“n‚· •Τ‚θ’l:‡¬Œγ‚Μ$image ƒTƒ“ƒvƒ‹i‚±‚ΜƒTƒ“ƒvƒ‹‚Μƒ\[ƒXj
sub image_negaposi{
 #ˆψ”
 my $image = $_[0];

 #•Ο”’θ‹`EEE‚Ζ‚’‚€‚©A‰½Žg‚Α‚Δ‚ι‚©”cˆ¬‚·‚ι‚½‚ί—ρ‹“
 my $image_width; my $image_height;
 my $r; my $g; my $b;
 my $draw_color;
 my $temp_image;


 ####•`‰ζ‚±‚±‚©‚η
 #ƒTƒCƒYŽζ“Ύ
 ($image_width,$image_height) = $image->getBounds() ;
 #ˆκŽž•`‰ζ—p‚ΜŠG‚π—pˆΣiƒJƒ‰[ƒpƒŒƒbƒg‚Μ–β‘θ‚Ε’ΌΪƒhƒbƒg‚π•`‚―‚Θ‚’j
 $temp_image = new GD::Image(1,1);
 
 #Šeƒhƒbƒg‚̏ˆ—‚Ι“ό‚ι
 for(my $i=0;$i<$image_width;++$i){
  for(my $j=0;$j<$image_height;++$j){
   #FŽζ“Ύ
   ($r,$g,$b) = $image->rgb($image->getPixel($i,$j));
   
  ########ƒlƒKƒ|ƒW•”########
  #”χ–­‚ɐ³Šm‚Ε‚Ν‚Θ‚’‚Ε‚·‚―‚ǁA‚ά‚ A‚’‚’‚Ζ‚΅‚ά‚Ή‚€τ
    $r = ($r - 128)*(-1)+127;
    $g = ($g - 128)*(-1)+127;
    $b = ($b - 128)*(-1)+127;
   ########ƒlƒKƒ|ƒW•”I—Ή####
   
   #ˆκŽž•`‰ζ—pƒLƒƒƒ“ƒpƒX‚Ι•`‚’‚Δ‚έ‚ι
   $draw_color = $temp_image->colorAllocate($r,$g,$b);
   $temp_image->setPixel(1,1,$draw_color) ;
   #‚ŁAƒRƒs[
   $image->copy($temp_image,$i,$j,1,1,1,1);
   #‚’‚Ώ‚’‚ΏŠJ•ϊ‚΅‚Θ‚’‚ƐF”‘«‚θ‚Θ‚’iƒmƒΦGj
   $temp_image->colorDeallocate($draw_color);
  }
 }
 ####•`‰ζƒRƒR‚ά‚Ε

 return $image;
}