打水印的操作是建立在已经上传完图片的前提下。
1、图片水印
打水印主要用到了imagecopymerge,图片合并。
imagecopymerge($im, $waterim, $srcx, $srcy, $watrx, $wary, $waterinfo[0], $waterinfo[1], $alpha);
参数说明:
- $im, $waterim画布;
- $srcx, $srcy是指原图的起点(X轴,Y轴);
- $watrx, $wary是指水印图片的起点(X轴,Y轴);
- $waterinfo[0], $waterinfo[1]是指水印图片的宽度、高度;
- $alpha是指水印图片的透明度0到100;
作用就是$waterim合并到$im里边。
//原图
$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)
参数说明:
- $fonsize:字体大小;
- $angle:可以填写0;
- $font:用到的字体,我用到的 $font = “E:\phpweb\c4/HYZhuZiALaDingJ.ttf”;
- $txt:要打水印的文字;
特别说明:$font字体存放路径,不能包含中文!
imagettfbbox返回值是数组,包含8个元素对应4个角的x,y坐标,我简单画了一下图方便理解
如图所示:坐标系统是向下,向右为正,并且左下角对应的坐标不是原点(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);
参数说明:
- $img:画布中的图片,通过imagecreatefromjpeg($srcimg),这里根据图片mime不同使用的也不同,分为imagecreatefromgif,imagecreatefromjpeg,imagecreatefrompng其他的bmp之类的可以百分百的用不到,不必考虑;
- $fonsize:打水印的字体大小;
- $angle:角度直接填写0;
- $x,$y:在图片的起始坐标点($x,$y)开始打水印,添加文字;
- $color:字体的颜色rgb和透明度;
- $font:字体路径$font = “E:\phpweb\c4/HYZhuZiALaDingJ.ttf”;
- $txt:要打印的文字;
说明:$x,$y并非是0,0开始,需要用到imagettfbbox返回值的坐标
文字水印效果图
//原图
$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);
}