图像添加水印在php中有很多种办法可以实现,他这些功能都是基于php中的GD库的,如果没有开户GD库是不可以使用水印功能的.
imagecopymerge() 函数用于拷贝并合并图像的一部分,成功返回 TRUE,否则返回 FALSE .
Windows下开启PHP的GD库支持,找到php.ini,打开内容,找到:;extension=php_gd2.dll,把最前面的分号“;”去掉,再保存即可,如果本来就没有分号,那就是已经开启了.
基本的语法:bool imagecopymerge( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct )
参数说明:参数 说明
dst_im 目标图像
src_im 被拷贝的源图像
dst_x 目标图像开始 x 坐标
dst_y 目标图像开始 y 坐标,x,y同为 0 则从左上角开始
src_x 拷贝图像开始 x 坐标
src_y 拷贝图像开始 y 坐标,x,y同为 0 则从左上角开始拷贝
src_w (从 src_x 开始)拷贝的宽度
src_h (从 src_y 开始)拷贝的高度
pct 图像合并程度,取值 0-100,当 pct=0 时,实际上什么也没做,反之完全合并.
当为 pct = 100 时对于调色板图像本函数和 imagecopy() 完全一样,知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现,代码如下:
header("Content-type: image/jpeg");
//原始图像
$dst="images/flower_1.jpg";
//得到原始图片信息
$dst_im= imagecreatefromjpeg($dst);
$dst_info=getimagesize($dst);
//水印图像
$src="images/logo.gif";
$src_im= imagecreatefromgif($src);
$src_info=getimagesize($src);
//水印透明度
$alpha= 30;
//合并水印图片
imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0],$dst_info[1]-$src_info[1],0,0,$src_info[0],
$src_info[1],$alpha);
//开源代码phpfensi.com
//输出合并后水印图片
imagejpeg($dst_im);
imagedestroy($dst_im);
imagedestroy($src_im);
?>
新版本之后imagecopymerge函数几乎不使用了,我们可直接使用imagecopy来生成水印两个函数的功能是完全一样的,代码如下:
//增加水印
$watermark=1;
$watertype=2;
$waterstring='';
$waterimg="z.png";//水印图片
$sFilePath='aa.jpg';
if($watermark==1)
{
$image_size=getimagesize($sFilePath);//上传的图片
$water_size=getimagesize($waterimg);//水印图片
$iinfo=getimagesize($sFilePath,$iinfo);
$nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
$white=imagecolorallocate($nimage,255,255,255);
$black=imagecolorallocate($nimage,0,0,0);
$red=imagecolorallocate($nimage,255,0,0);
imagefill($nimage,0,0,$white);
switch($iinfo[2])
{
case1:
$simage=imagecreatefromgif($sFilePath);
break;
case2:
$simage=imagecreatefromjpeg($sFilePath);
break;
case3:
$simage=imagecreatefrompng($sFilePath);
break;
// case 6:
// $simage =imagecreatefromwbmp($sFilePath);
// break;
default:
die("不支持的文件类型");
exit;
}
imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
switch($watertype)
{
case1://加水印字符串
imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
break;
case2://加水印图片
$simage1=imagecreatefrompng($waterimg);
$x=$image_size[0]-$water_size[0];
$y=$image_size[1]-$water_size[1];
imagecopy($nimage,$simage1,$x,$y,0,0,240,65);
imagedestroy($simage1);
break;
}
switch($iinfo[2])
{
case1:
imagegif($nimage,$sFilePath);
// imagejpeg($nimage, $sFilePath);
break;
case2:
imagejpeg($nimage,$sFilePath);
break;
case3:
imagepng($nimage,$sFilePath);
break;
// case 6:
// imagewbmp($nimage, $sFilePath);
// //imagejpeg($nimage, $sFilePath);
// break;
}
//覆盖原上传文件
imagedestroy($nimage);
imagedestroy($simage);
}
一个更好的功能,可以生成缩略并且还可以给图片添加水印,想操作图片,先得把图片的大小,类型信息得到,水印:就是把指定的水印复制到目标上,并加透明效果,缩略图:就是把大图片复制到小尺寸画面上,代码如下:
classImageTool {
// imageInfo 分析图片的信息
// return array()
publicstaticfunctionimageInfo($image) {
// 判断图片是否存在
if(!file_exists($image)) {
returnfalse;
}
$info=getimagesize($image);
if($info== false) {
returnfalse;
}
// 此时info分析出来,是一个数组
$img['width'] =$info[0];
$img['height'] =$info[1];
$img['ext'] =substr($info['mime'],strpos($info['mime'],'/') + 1);
return$img;
}
/*
加水印功能
parm String $dst 等操作图片
parm String $water 水印小图
parm String $save,不填则默认替换原始图
*/
publicstaticfunctionwater($dst,$water,$save= NULL,$pos= 2,$alpha= 50) {
// 先保证2个图片存在
if(!file_exists($dst) || !file_exists($water)) {
returnfalse;
}
// 首先保证水印不能比待操作图片还大
$dinfo= self::imageInfo($dst);
$winfo= self::imageInfo($water);
if($winfo['height'] >$dinfo['height'] ||$winfo['width'] >$dinfo['width']) {
returnfalse;
}
// 两张图,读到画布上! 但是图片可能是png,可能是jpeg,用什么函数读?
$dfunc='imagecreatefrom'.$dinfo['ext'];
$wfunc='imagecreatefrom'.$winfo['ext'];
if(!function_exists($dfunc) || !function_exists($wfunc)) {
returnfalse;
}
// 动态加载函数来创建画布
$dim=$dfunc($dst);
// 创建待操作的画布
$wim=$wfunc($water);
// 创建水印画布
// 根据水印的位置 计算粘贴的坐标
switch($pos) {
case0 :
// 左上角
$posx= 0;
$posy= 0;
break;
case1 :
// 右上角
$posx=$dinfo['width'] –$winfo['width'];
$posy= 0;
break;
case3 :
// 左下角
$posx= 0;
$posy=$dinfo['height'] –$winfo['height'];
break;
default:
$posx=$dinfo['width'] –$winfo['width'];
$posy=$dinfo['height'] –$winfo['height'];
}
// 加水印
imagecopymerge($dim,$wim,$posx,$posy, 0, 0,$winfo['width'],$winfo['height'],$alpha);
// 保存
if(!$save) {
$save=$dst;
unlink($dst);
// 删除原图
}
$createfunc='image'.$dinfo['ext'];
$createfunc($dim,$save);
imagedestroy($dim);
imagedestroy($wim);
returntrue;
}
/**
thumb 生成缩略图
等比例缩放,两边留白
**/
publicstaticfunctionthumb($dst,$save= NULL,$width= 200,$height= 200) {
// 首先判断待处理的图片存不存在
$dinfo= self::imageInfo($dst);
if($dinfo== false) {
returnfalse;
}
// 计算缩放比例
$calc= min($width/$dinfo['width'],$height/$dinfo['height']);
// 创建原始图的画布
$dfunc='imagecreatefrom'.$dinfo['ext'];
$dim=$dfunc($dst);
// 创建缩略画布
$tim= imagecreatetruecolor($width,$height);
// 创建白色填充缩略画布
$white= imagecolorallocate($tim, 255, 255, 255);
// 填充缩略画布
imagefill($tim, 0, 0,$white);
// 复制并缩略
$dwidth= (int)$dinfo['width'] *$calc;
$dheight= (int)$dinfo['height'] *$calc;
$paddingx= (int)($width–$dwidth) / 2;
$paddingy= (int)($height–$dheight) / 2;
imagecopyresampled($tim,$dim,$paddingx,$paddingy, 0, 0,$dwidth,$dheight,$dinfo['width'],
$dinfo['height']);
// 保存图片
if(!$save) {
$save=$dst;
unlink($dst);
}
$createfunc='image'.$dinfo['ext'];
$createfunc($tim,$save);
imagedestroy($dim);
imagedestroy($tim);
returntrue;
}
}