您的位置 首页 php

php手把手教你做网站(三十一)上传图片打水印,图片、文字水印

打水印的操作是建立在已经上传完图片的前提下。

1、图片水印

打水印主要用到了imagecopymerge,图片合并。

imagecopymerge($im, $waterim, $srcx, $srcy, $watrx, $wary, $waterinfo[0], $waterinfo[1], $alpha);

参数说明:

  1. $im, $waterim画布;
  2. $srcx, $srcy是指原图的起点(X轴,Y轴);
  3. $watrx, $wary是指水印图片的起点(X轴,Y轴);
  4. $waterinfo[0], $waterinfo[1]是指水印图片的宽度、高度;
  5. $alpha是指水印图片的透明度0到100;

作用就是$waterim合并到$im里边。

图1 图片在中间水印效果

 //原图
$srcimg = "E:\phpweb\单语html10.21.11/kf7.jpg";
//水印图片
$waterpic="E:\phpweb\单语html10.21.11/logo.jpg";
//打完水印以后保存的图片
$savename="E:\phpweb\单语html10.21.11/kf.jpg";
/*
  打水印的位置
  *1  左上  2  右上   3 中间   4左下  5  右下
*/
$position=5;
//小于最小宽度  高度  不打水印
$minwidth=300;
$minheight=100;
//水印的透明度  
$alpha=30;
img_water_mark($srcimg,$waterpic,$savename,$position,$alpha,$minwidth,$minheight);  

img_water_mark方法(函数)

  function img_water_mark($srcimg,$waterpic,$savename,$position,$alpha,$minwidh,$minheight)
{
    $srcinfo = getimagesize($srcimg);
	//小于最小宽度 或者 高度不做任何操作
	if($srcinfo[0]<$minwidh||$srcinfo[1]<$minheight){
	    return '';
	}
    $waterinfo = getimagesize($waterpic);

    switch ($srcinfo[2]) {
        case 1: 
			$im=imagecreatefromgif($srcimg); 
		break;
        case 2:
			$im=imagecreatefromjpeg($srcimg);
		break;
        case 3: 
			$im=imagecreatefrompng($srcimg);
		break;
    }

    switch ($waterinfo[2]) {
        case 1: 
			$waterim=imagecreatefromgif($waterpic); 
		break;
        case 2:
			$waterim=imagecreatefromjpeg($waterpic);
		break;
        case 3: 
			$waterim=imagecreatefrompng($waterpic);
		break;
    }
    //水印图片的位置
    switch ($position) {
    //1顶部居左
    case 1: $x=$y=20; break;
    //2顶部居右
    case 2: $x = $srcinfo[0]-$waterinfo[0]-20; $y = 20; break;
    //3居中
    case 3: $x = ($srcinfo[0]-$waterinfo[0])/2; $y = ($srcinfo[1]-$waterinfo[1])/2; break;
    //4底部居左
    case 4: $x = 20; $y = $srcinfo[1]-$waterinfo[1]-20; break;
    //5底部居右
    case 5: $x = $srcinfo[0]-$waterinfo[0]-20; $y = $srcinfo[1]-$waterinfo[1]-20; break;
    default: $x=$y=20;
    }
    //合并图片
    imagecopymerge($im, $waterim, $x, $y, 0, 0, $waterinfo[0], $waterinfo[1], $alpha);
    
    //保存图片
    switch ($srcinfo[2]) {
        case 1: 
			imagegif($im,$savename);
		break;
        case 2: 
			imagejpeg($im,$savename); 
		break;
        case 3: 
			imagepng($im,$savename); 
		break;

    }
    imagedestroy($im);
    imagedestroy($waterim);
    
    /*
	  直接预览
	 header('Content-Type: '.$srcinfo['mime']);
      switch ($srcinfo[2]) {
        case 1: 
			imagegif($im);
		break;
        case 2: 
			imagejpeg($im); 
		break;
        case 3: 
			imagepng($im); 
		break;

      }
	*/
}  

2、文字水印

主要用到imagettfbbox获取文字的宽度,高度,imagettftext写入文字

imagettfbbox($fonsize,$angle,$font,$txt)

参数说明:

  1. $fonsize:字体大小;
  2. $angle:可以填写0;
  3. $font:用到的字体,我用到的 $font = “E:\phpweb\c4/HYZhuZiALaDingJ.ttf”;
  4. $txt:要打水印的文字;

特别说明:$font字体存放路径,不能包含中文!

imagettfbbox返回值是数组,包含8个元素对应4个角的x,y坐标,我简单画了一下图方便理解

图2 imagettfbbox返回值4角坐标

如图所示:坐标系统是向下,向右为正,并且左下角对应的坐标不是原点(0,0),这样我们可以很清晰地知道文字的宽高。

 //原图
$srcimg = "E:\phpweb\单语html10.21.11/kf7.jpg";
//水印图片
$waterpic="E:\phpweb\单语html10.21.11/logo.jpg";
//打完水印以后保存的图片
$savename="E:\phpweb\单语html10.21.11/kf.jpg";
/*
  打水印的位置
  *1  左上  2  右上   3 中间   4左下  5  右下
*/
$position=5;
//小于最小宽度  高度  不打水印
$minwidth=300;
$minheight=100;
//水印的透明度  
$alpha=100;
img_water_mark($srcimg,$waterpic,$savename,$position,$alpha,$minwidth,$minheight);  

imagettftext($img,$fonsize,$angle,$x,$y,$color,$font,$txt);

参数说明:

  1. $img:画布中的图片,通过imagecreatefromjpeg($srcimg),这里根据图片mime不同使用的也不同,分为imagecreatefromgif,imagecreatefromjpeg,imagecreatefrompng其他的bmp之类的可以百分百的用不到,不必考虑;
  2. $fonsize:打水印的字体大小;
  3. $angle:角度直接填写0;
  4. $x,$y:在图片的起始坐标点($x,$y)开始打水印,添加文字;
  5. $color:字体的颜色rgb和透明度;
  6. $font:字体路径$font = “E:\phpweb\c4/HYZhuZiALaDingJ.ttf”;
  7. $txt:要打印的文字;

说明:$x,$y并非是0,0开始,需要用到imagettfbbox返回值的坐标

文字水印效果图

图3 文字在中间水印效果图

 //原图
$srcimg = "E:\phpweb\单语html10.21.11/kf7.jpg";
//要打印的文字
$watertxt="中文图片打水印mark演示";
//打完水印以后保存的图片
$savename="E:\phpweb\单语html10.21.11/kf.jpg";
//字体路径 不能包含中文
$font = "E:\phpweb\c4/HYZhuZiALaDingJ.ttf";
/*
  打水印的位置
  *1  左上  2  右上   3 中间   4左下  5  右下
*/
$position=3;
//小于最小宽度  高度  不打水印
$minwidth=300;
$minheight=100;
//水印的透明度  
$alpha=70;
//字体大小
$fonsize=20;
//设置距离上下左右空白距离
$blank=0;
imagetxt($srcimg,$watertxt,$savename,$fonsize,$font,$position,$minwidth,$minheight,$alpha,$blank);  

imagetxt方法打水印

  Function imagetxt($srcimg,$watertxt,$savename,$fonsize,$font,$position,$minwidth,$minheight,$alpha,$blank){
    //获取图片的信息(得到图片的基本信息)
    $info = getimagesize($srcimg);
    //小于限制宽度   不打水印
	if($info[0]<$minwidth||$info[1]<$minheight){
		return $srcimg;
	}
	//计算要打印的文字所占的宽度高度

	$txtarr=imagettfbbox($fonsize,0,$font,$watertxt);
	$txtwidth=$txtarr[2]-$txtarr[0];
	$txtheight=$txtarr[3]-$txtarr[5];

    //载入图片
    switch ($info[2]) {
        case 1: 
			$img=imagecreatefromgif($srcimg); 
		break;
        case 2:
			$img=imagecreatefromjpeg($srcimg);
		break;
        case 3: 
			$img=imagecreatefrompng($srcimg);
		break;
    }
	
	//设置字体的颜色rgb和透明度
	$color = imagecolorallocatealpha($img,0,0,0,$alpha);

	//abs($num)  取$num的绝对值
	//起点实际是 (abs($txtarr[0]),abs($txtarr[5])) 而不是(0,0);
	switch ($position) {
		//1顶部居左
		case 1: 
			$x=abs($txtarr[0])+$blank;$y=abs($txtarr[5])+$blank; 
		break;
		//2顶部居右
		case 2: 
			$x = abs($txtarr[0])+$info[0]-$txtwidth-$blank; $y = abs($txtarr[5])+$blank; 
		break;
		//3居中
		case 3:
			$x = abs($txtarr[0])+($info[0]-$txtwidth)/2; $y = abs($txtarr[5])+ ($info[1]-$txtheight)/2; 
		break;
		//4底部居左
		case 4: 
			$x = abs($txtarr[0])+$blank; $y = abs($txtarr[5])+$info[1]-$txtheight-$blank; 
		break;
		//5底部居右
		case 5: 
			$x = abs($txtarr[0])+$info[0]-$txtwidth-$blank; $y =abs($txtarr[5])+$info[1]-$txtheight-$blank;  
		break;
	}

	//写入文字
	imagettftext($img,$fonsize,0,$x,$y,$color,$font,$watertxt);
	/*保存图片*/
	/*
    switch ($info[2]) {
        case 1: 
			imagegif($img,$savename);
		break;
        case 2: 
			imagejpeg($img,$savename); 
		break;
        case 3: 
			imagepng($img,$savename); 
		break;
    }
	*/

	//浏览器输出
	header("Content-type:".$info['mime']);
    switch ($info[2]) {
        case 1: 
			imagegif($img);
		break;
        case 2: 
			imagejpeg($img); 
		break;
        case 3: 
			imagepng($img); 
		break;
    }
	/*/
	/*销毁图片*/
	imagedestroy($img);
}  

文章来源:智云一二三科技

文章标题:php手把手教你做网站(三十一)上传图片打水印,图片、文字水印

文章地址:https://www.zhihuclub.com/80541.shtml

关于作者: 智云科技

热门文章

发表评论

您的电子邮箱地址不会被公开。

网站地图