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() 完全一样,知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现,代码如下:

  1. <?php
  2. header("Content-type: image/jpeg");
  3. //原始图像
  4. $dst = "images/flower_1.jpg";
  5. //得到原始图片信息
  6. $dst_im = imagecreatefromjpeg($dst);
  7. $dst_info = getimagesize($dst);
  8. //水印图像
  9. $src = "images/logo.gif";
  10. $src_im = imagecreatefromgif($src);
  11. $src_info = getimagesize($src);
  12. //水印透明度
  13. $alpha = 30;
  14. //合并水印图片
  15. imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0],$dst_info[1]-$src_info[1],0,0,$src_info[0],
  16. $src_info[1],$alpha);
  17. //开源代码phpfensi.com
  18. //输出合并后水印图片
  19. imagejpeg($dst_im);
  20. imagedestroy($dst_im);
  21. imagedestroy($src_im);
  22. ?>

新版本之后imagecopymerge函数几乎不使用了,我们可直接使用imagecopy来生成水印两个函数的功能是完全一样的,代码如下:

  1. //增加水印
  2. $watermark =1;
  3. $watertype =2;
  4. $waterstring ='';
  5. $waterimg="z.png"; //水印图片
  6. $sFilePath ='aa.jpg';
  7. if($watermark==1)
  8. {
  9. $image_size = getimagesize($sFilePath); //上传的图片
  10. $water_size = getimagesize($waterimg); //水印图片
  11. $iinfo=getimagesize($sFilePath,$iinfo);
  12. $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
  13. $white=imagecolorallocate($nimage,255,255,255);
  14. $black=imagecolorallocate($nimage,0,0,0);
  15. $red=imagecolorallocate($nimage,255,0,0);
  16. imagefill($nimage,0,0,$white);
  17. switch ($iinfo[2])
  18. {
  19. case 1:
  20. $simage =imagecreatefromgif($sFilePath);
  21. break;
  22. case 2:
  23. $simage =imagecreatefromjpeg($sFilePath);
  24. break;
  25. case 3:
  26. $simage =imagecreatefrompng($sFilePath);
  27. break;
  28. // case 6:
  29. // $simage =imagecreatefromwbmp($sFilePath);
  30. // break;
  31. default:
  32. die("不支持的文件类型");
  33. exit;
  34. }
  35. imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
  36. switch($watertype)
  37. {
  38. case 1: //加水印字符串
  39. imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
  40. break;
  41. case 2: //加水印图片
  42. $simage1 =imagecreatefrompng($waterimg);
  43. $x= $image_size[0]-$water_size[0];
  44. $y= $image_size[1]-$water_size[1];
  45. imagecopy($nimage,$simage1,$x,$y,0,0,240,65);
  46. imagedestroy($simage1);
  47. break;
  48. }
  49. switch ($iinfo[2])
  50. {
  51. case 1:
  52. imagegif($nimage, $sFilePath);
  53. // imagejpeg($nimage, $sFilePath);
  54. break;
  55. case 2:
  56. imagejpeg($nimage, $sFilePath);
  57. break;
  58. case 3:
  59. imagepng($nimage, $sFilePath);
  60. break;
  61. // case 6:
  62. // imagewbmp($nimage, $sFilePath);
  63. // //imagejpeg($nimage, $sFilePath);
  64. // break;
  65. }
  66. //覆盖原上传文件
  67. imagedestroy($nimage);
  68. imagedestroy($simage);
  69. }

一个更好的功能,可以生成缩略并且还可以给图片添加水印,想操作图片,先得把图片的大小,类型信息得到,水印:就是把指定的水印复制到目标上,并加透明效果,缩略图:就是把大图片复制到小尺寸画面上,代码如下:

  1. class ImageTool {
  2. // imageInfo 分析图片的信息
  3. // return array()
  4. public static function imageInfo($image) {
  5. // 判断图片是否存在
  6. if (!file_exists($image)) {
  7. return false;
  8. }
  9. $info = getimagesize($image);
  10. if ($info == false) {
  11. return false;
  12. }
  13. // 此时info分析出来,是一个数组
  14. $img['width'] = $info[0];
  15. $img['height'] = $info[1];
  16. $img['ext'] = substr($info['mime'], strpos($info['mime'], '/') + 1);
  17. return $img;
  18. }
  19. /*
  20. 加水印功能
  21. parm String $dst 等操作图片
  22. parm String $water 水印小图
  23. parm String $save,不填则默认替换原始图
  24. */
  25. public static function water($dst, $water, $save = NULL, $pos = 2, $alpha = 50) {
  26. // 先保证2个图片存在
  27. if (!file_exists($dst) || !file_exists($water)) {
  28. return false;
  29. }
  30. // 首先保证水印不能比待操作图片还大
  31. $dinfo = self::imageInfo($dst);
  32. $winfo = self::imageInfo($water);
  33. if ($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']) {
  34. return false;
  35. }
  36. // 两张图,读到画布上! 但是图片可能是png,可能是jpeg,用什么函数读?
  37. $dfunc = 'imagecreatefrom' . $dinfo['ext'];
  38. $wfunc = 'imagecreatefrom' . $winfo['ext'];
  39. if (!function_exists($dfunc) || !function_exists($wfunc)) {
  40. return false;
  41. }
  42. // 动态加载函数来创建画布
  43. $dim = $dfunc($dst);
  44. // 创建待操作的画布
  45. $wim = $wfunc($water);
  46. // 创建水印画布
  47. // 根据水印的位置 计算粘贴的坐标
  48. switch($pos) {
  49. case 0 :
  50. // 左上角
  51. $posx = 0;
  52. $posy = 0;
  53. break;
  54. case 1 :
  55. // 右上角
  56. $posx = $dinfo['width'] - $winfo['width'];
  57. $posy = 0;
  58. break;
  59. case 3 :
  60. // 左下角
  61. $posx = 0;
  62. $posy = $dinfo['height'] - $winfo['height'];
  63. break;
  64. default :
  65. $posx = $dinfo['width'] - $winfo['width'];
  66. $posy = $dinfo['height'] - $winfo['height'];
  67. }
  68. // 加水印
  69. imagecopymerge($dim, $wim, $posx, $posy, 0, 0, $winfo['width'], $winfo['height'], $alpha);
  70. // 保存
  71. if (!$save) {
  72. $save = $dst;
  73. unlink($dst);
  74. // 删除原图
  75. }
  76. $createfunc = 'image' . $dinfo['ext'];
  77. $createfunc($dim, $save);
  78. imagedestroy($dim);
  79. imagedestroy($wim);
  80. return true;
  81. }
  82. /**
  83. thumb 生成缩略图
  84. 等比例缩放,两边留白
  85. **/
  86. public static function thumb($dst, $save = NULL, $width = 200, $height = 200) {
  87. // 首先判断待处理的图片存不存在
  88. $dinfo = self::imageInfo($dst);
  89. if ($dinfo == false) {
  90. return false;
  91. }
  92. // 计算缩放比例
  93. $calc = min($width / $dinfo['width'], $height / $dinfo['height']);
  94. // 创建原始图的画布
  95. $dfunc = 'imagecreatefrom' . $dinfo['ext'];
  96. $dim = $dfunc($dst);
  97. // 创建缩略画布
  98. $tim = imagecreatetruecolor($width, $height);
  99. // 创建白色填充缩略画布
  100. $white = imagecolorallocate($tim, 255, 255, 255);
  101. // 填充缩略画布
  102. imagefill($tim, 0, 0, $white);
  103. // 复制并缩略
  104. $dwidth = (int)$dinfo['width'] * $calc;
  105. $dheight = (int)$dinfo['height'] * $calc;
  106. $paddingx = (int)($width - $dwidth) / 2;
  107. $paddingy = (int)($height - $dheight) / 2;
  108. imagecopyresampled($tim, $dim, $paddingx, $paddingy, 0, 0, $dwidth, $dheight, $dinfo['width'],
  109. $dinfo['height']);
  110. // 保存图片
  111. if (!$save) {
  112. $save = $dst;
  113. unlink($dst);
  114. }
  115. $createfunc = 'image' . $dinfo['ext'];
  116. $createfunc($tim, $save);
  117. imagedestroy($dim);
  118. imagedestroy($tim);
  119. return true;
  120. }
  121. }