PHP imagecopy()与imagecopymerge()图像添加水印
图像添加水印在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() 完全一样,知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现,代码如下:
- <?php
- 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])
- {
- case 1:
- $simage =imagecreatefromgif($sFilePath);
- break;
- case 2:
- $simage =imagecreatefromjpeg($sFilePath);
- break;
- case 3:
- $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)
- {
- case 1: //加水印字符串
- imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
- break;
- case 2: //加水印图片
- $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])
- {
- case 1:
- imagegif($nimage, $sFilePath);
- // imagejpeg($nimage, $sFilePath);
- break;
- case 2:
- imagejpeg($nimage, $sFilePath);
- break;
- case 3:
- imagepng($nimage, $sFilePath);
- break;
- // case 6:
- // imagewbmp($nimage, $sFilePath);
- // //imagejpeg($nimage, $sFilePath);
- // break;
- }
- //覆盖原上传文件
- imagedestroy($nimage);
- imagedestroy($simage);
- }
一个更好的功能,可以生成缩略并且还可以给图片添加水印,想操作图片,先得把图片的大小,类型信息得到,水印:就是把指定的水印复制到目标上,并加透明效果,缩略图:就是把大图片复制到小尺寸画面上,代码如下:
- class ImageTool {
- // imageInfo 分析图片的信息
- // return array()
- public static function imageInfo($image) {
- // 判断图片是否存在
- if (!file_exists($image)) {
- return false;
- }
- $info = getimagesize($image);
- if ($info == false) {
- return false;
- }
- // 此时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,不填则默认替换原始图
- */
- public static function water($dst, $water, $save = NULL, $pos = 2, $alpha = 50) {
- // 先保证2个图片存在
- if (!file_exists($dst) || !file_exists($water)) {
- return false;
- }
- // 首先保证水印不能比待操作图片还大
- $dinfo = self::imageInfo($dst);
- $winfo = self::imageInfo($water);
- if ($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']) {
- return false;
- }
- // 两张图,读到画布上! 但是图片可能是png,可能是jpeg,用什么函数读?
- $dfunc = 'imagecreatefrom' . $dinfo['ext'];
- $wfunc = 'imagecreatefrom' . $winfo['ext'];
- if (!function_exists($dfunc) || !function_exists($wfunc)) {
- return false;
- }
- // 动态加载函数来创建画布
- $dim = $dfunc($dst);
- // 创建待操作的画布
- $wim = $wfunc($water);
- // 创建水印画布
- // 根据水印的位置 计算粘贴的坐标
- switch($pos) {
- case 0 :
- // 左上角
- $posx = 0;
- $posy = 0;
- break;
- case 1 :
- // 右上角
- $posx = $dinfo['width'] - $winfo['width'];
- $posy = 0;
- break;
- case 3 :
- // 左下角
- $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);
- return true;
- }
- /**
- thumb 生成缩略图
- 等比例缩放,两边留白
- **/
- public static function thumb($dst, $save = NULL, $width = 200, $height = 200) {
- // 首先判断待处理的图片存不存在
- $dinfo = self::imageInfo($dst);
- if ($dinfo == false) {
- return false;
- }
- // 计算缩放比例
- $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);
- return true;
- }
- }