首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

求教:读入一幅gif图片,如何把其中5种颜色替换成透明?

如题,有一张名为‘1.gif’的512*512的图片,要把图中的5种颜色替换成透明,然后输出为1.png的图片,五种颜色如下:

1、rgb=4,2,4
2、rgb=252,230,180
3、rgb=252,254,252
4、rgb=252,162,124
5、rgb=124,254,212

真心求教,谢谢高手!
昵称: kvkvman  时间: 2013-05-28 11:07:39
class MyImage{
  static function ImageColorAllocateHEX($im, $s){
    if($s{0} == "#") $s = substr($s,1);
    $bg_dec = hexdec($s);
    return imagecolorallocate($im,
      ($bg_dec & 0xFF0000) >> 16,
      ($bg_dec & 0x00FF00) >>  8,
      ($bg_dec & 0x0000FF)
    );
  }

  static function imagetextouter(&$im, $size, $x, $y, $color, $fontfile, $text, $outer){
    $ttf = false;
    if (is_file($fontfile)){
      $ttf = true;
      $area = imagettfbbox($size, 0, $fontfile, $text);
      $width  = $area[2] - $area[0] + 2;
      $height = $area[1] - $area[5] + 2;
    } else {
      $width  = strlen($text) * 10;
      $height = 16;
    }
    $im_tmp = imagecreate($width, $height);
    $white = imagecolorallocate($im_tmp, 255, 255, 255);
    $black = imagecolorallocate($im_tmp, 0, 0, 0);
    $color = self::ImageColorAllocateHEX($im, $color);
    $outer = self::ImageColorAllocateHEX($im, $outer);
    if ($ttf){
      imagettftext($im_tmp, $size, 0, 0, $height - 2, $black, $fontfile, $text);
      imagettftext($im, $size, 0, $x, $y, $color, $fontfile, $text);
      $y = $y - $height + 2;
    }
    else{
      imagestring($im_tmp, $size, 0, 0, $text, $black);
      imagestring($im, $size, $x, $y, $text, $color);
    }
    for ($i = 0; $i < $width; $i ++){
      for ($j = 0; $j < $height; $j ++){
        $c = ImageColorAt($im_tmp, $i, $j);
        if ($c !== $white){
          ImageColorAt ($im_tmp, $i, $j - 1) != $white || imagesetpixel($im, $x + $i, $y + $j - 1, $outer);
          ImageColorAt ($im_tmp, $i, $j + 1) != $white || imagesetpixel($im, $x + $i, $y + $j + 1, $outer);
          ImageColorAt ($im_tmp, $i - 1, $j) != $white || imagesetpixel($im, $x + $i - 1, $y + $j, $outer);
          ImageColorAt ($im_tmp, $i + 1, $j) != $white || imagesetpixel($im, $x + $i + 1, $y + $j, $outer);
          // 取消注释,与Fireworks的发光效果相同
          ImageColorAt ($im_tmp, $i - 1, $j - 1) != $white || imagesetpixel($im, $x + $i - 1, $y + $j - 1, $outer);
          ImageColorAt ($im_tmp, $i + 1, $j - 1) != $white || imagesetpixel($im, $x + $i + 1, $y + $j - 1, $outer);
          ImageColorAt ($im_tmp, $i - 1, $j + 1) != $white || imagesetpixel($im, $x + $i - 1, $y + $j + 1, $outer);
          ImageColorAt ($im_tmp, $i + 1, $j + 1) != $white || imagesetpixel($im, $x + $i + 1, $y + $j + 1, $outer);
        }
      }
    }
    imagedestroy($im_tmp);
  }


}

你要的东西在这个例子里可以找到思路,具体的自己动下手呗,呵呵
昵称: asmodai  时间: 2013-05-28 15:36:06