原创 用PHP透明GD库处理图片(1)收藏

新一篇: 利用PEAR 和 PHP给你的网络应用添加条形码  | 旧一篇: PHP 5.0 Pear安装方法

                         
          PHP的提供了一个强大的处理图片的GD库,可是这方面的资料不是很多,要做出具有特定效果的漂亮图片并不是很容易。现在把在网上搜集到的这方面的资料整理一下。

下面这个函数实现将一个图片拷贝到另一个图片的同时设置Alpha值的效果,是从喜悦国际村里看到的。程序可以直接运行,不过要确保同目录下有in.png和out.jpg两张图片,当然还要确保你的PHP安装了GD库扩展噢。

<?php
//****************************************************************************************
//带有Alpha值设定的imagecopy函数,实现将一个图片拷贝到另一个图片的同时设置Alpha值的效果。
//PHP的GD函数库中,没有直接实现带透明度设定的图片复制函数,这里使用的是像素级的复制。
//所使用到的GD函数:
//imagealphablending(),imagecolorat(),imagecolorallocatealpha(),imagesetpixel()
//imagealphablending(resource image,true)是默认值,这里只是显示赋值。
//版权信息:
//作者:高铭源 昵称:Gapple E-mail:
gapple@sina.com 创作时间:2004年5月7日 19:00~22:30
//补充完善版本是在2004-05-10 12:00完成的。感谢PASiO提供帮助:“透明的PNG图片即可而且没有白色杂点 :D ”。
//****************************************************************************************
//已知问题:1)使用Png文件格式没有问题,其他图片颜色会有杂点,也就是无法干净镂空Logo图片。
//     2)Png文件不能使用Photoshop生成,而要用Firework MX以上的版本,Firework3.0经测试不可以。
//****************************************************************************************
//----------------------------------------函数参数说明------------------------------------
//
//变量         含义               类型
//$dst_im       目标图像             resource
//$src_im       源图像               resource
//$dst_x         目标图像x坐标         int
//$dst_y         目标图像y坐标         int
//$dst_w         目标图像宽度           int
//$dst_h         目标图像高度           int
//$src_w         源图像宽度           int
//$src_h         源图像高度           int
//$tran_color     期望的源图像中透明的颜色   int
//$alpha         透明度设定值(0~127)     int
//
//****************************************************************************************
function imagealphacopy($dst_im,$src_im,$dst_x,$dst_y,$dst_w,$dst_h,$src_w,$src_h,$tran_color,$alpha)
{
//判断是否越界
if (($src_w+$dst_x)>$dst_w)
{
return(false);
}
if (($src_h+$dst_y)>$dst_h)
{
return(false);
}
//判断完毕!

imagealphablending($dst_im,true);
for ($j=0;$j<=$src_h-1;$j++)
{
for ($i=0;$i<=$src_w-1;$i++)
  {
  $rgb = imagecolorat($src_im,$i,$j);
  $r = ($rgb >> 16) & 0xFF;
  $g = ($rgb >> 8) & 0xFF;
  $b = $rgb & 0xFF;
  $now_color=imagecolorallocate($dst_im,$r,$g,$b);
  if ($now_color==$tran_color)
  {
  continue;
  }
  else
  {
  //echo $now_color."<br>";
  $color=imagecolorallocatealpha($dst_im,$r,$g,$b,$alpha);
  imagesetpixel($dst_im,$dst_x+$i,$dst_y+$j,$color);
  }

  }
}
}


$im_in=imagecreatefrompng("in.png");
$insize=getimagesize("in.png");
$im_out=imagecreatefromjpeg("out.jpg");
$outsize=getimagesize("out.jpg");
$white=imagecolorallocate ($im_out,255,255,255);
imagealphacopy($im_out,$im_in,70,180,$outsize[0],$outsize[1],$insize[0],$insize[1],$white,75);


imagepng($im_out,"large.png");
imagedestroy($im_in);
imagedestroy($im_out);
?>
<img src="large.png" border=0>

发表于 @ 2005年10月22日 16:45:00|评论(loading...)|编辑

新一篇: 利用PEAR 和 PHP给你的网络应用添加条形码  | 旧一篇: PHP 5.0 Pear安装方法

评论

#truefalse 发表于2008-04-13 22:53:47  IP: 202.43.217.*
感谢楼主,用你的这个文章解决了我一个好久没有解决的问题,就是非规则的图片 如何加到一个背景图片,现在我用你介绍的代码改进了我做的 一个插件的效果 :NCP 里面的 我的足迹
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 务实,不虚伪