给图片加水印的具体做法.docx
《给图片加水印的具体做法.docx》由会员分享,可在线阅读,更多相关《给图片加水印的具体做法.docx(11页珍藏版)》请在冰豆网上搜索。
![给图片加水印的具体做法.docx](https://file1.bdocx.com/fileroot1/2022-12/11/1c1b3f20-ede2-4606-becb-3f28674dbc05/1c1b3f20-ede2-4606-becb-3f28674dbc051.gif)
给图片加水印的具体做法
给图片加水印的具体做法(文字型水印和图片型水印)
Test.php文件具体内容:
php
/*
*功能:
PHP图片水印(水印支持图片或文字)
*参数:
*$backImage背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
*$waterPos水印位置,有10种状态,0为随机位置;
*1为顶端居左,2为顶端居中,3为顶端居右;
*4为中部居左,5为中部居中,6为中部居右;
*7为底端居左,8为底端居中,9为底端居右;
*$waterImage图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
*$waterText文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
*$textFont文字大小,值为1、2、3、4或5,默认为5;
*$textColor文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
*
*注意:
SupportGD2.0,SupportFreeType、GIFRead、GIFCreate、JPG、PNG
*$waterImage和$waterText最好不要同时使用,选其中之一即可,优先使用$waterImage。
*当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
*加水印后的图片的文件名和$backImage一样。
*原作者:
longware于2004-11-3
*修改:
杨正元2012-2-2516:
13:
23
*
*/
functionimageWaterMake($backImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#234567")
{
$isWaterImage=FALSE;
$formatMsg="暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。
";
//读取水印文件
if(!
empty($waterImage)&&file_exists($waterImage)){
$isWaterImage=TRUE;
$water_info=getimagesize($waterImage);
/*
*getimagesize($waterImage)
*解释:
*这里$arr为一个数组类型
*$arr[0]为图像的宽度
*$arr[1]为图像的高度
*$arr[2]为图像的格式,包括jpg、gif和png等
*$arr[3]为图像的宽度和高度,内容为width="xxx"height="yyy"
*/
$water_w=$water_info[0];//取得水印图片的宽
$water_h=$water_info[1];//取得水印图片的高
switch($water_info[2]){//取到水印图片的格式
case1:
$water_image=imagecreatefromgif($waterImage);
break;
case2:
$water_image=imagecreatefromjpeg($waterImage);
break;
case3:
$water_image=imagecreatefrompng($waterImage);
break;
default:
die($formatMsg);
}
}
//读取背景图片
if(file_exists($backImage)&&!
empty($backImage)){
$back_info=getimagesize($backImage);
$back_w=$back_info[0];//取得背景图片的宽
$back_h=$back_info[1];//取得背景图片的高
switch($back_info[2]){//取到水印图片的格式
case1:
$back_image=imagecreatefromgif($backImage);
break;
case2:
$back_image=imagecreatefromjpeg($backImage);
break;
case3:
$back_image=imagecreatefrompng($backImage);
break;
default:
die($formatMsg);
}
}else{
die('需要加水印的图片不存在!
');
}
//水印位置
if($isWaterImage){//图片水印
//图片型水印
$w=$water_w;
$h=$water_h;
$label="图片的";
}else{
//文字型的水印
$temp=imagettfbbox(ceil($textFont*2.5),0,"C:
\WINDOWS\Fonts\SIMLI.TTF",$waterText);
/*
*ceil()函数向上舍入为最接近的整数。
*
*
*
*
*imagettfbbox函数的坐标系统的认识
*写TTF文字到图中。
*语法:
arrayImageTTFBBox(intsize,intangle,stringfontfile,stringtext);
*返回值:
数组
*函数种类:
图形处理
*内容说明
*本函数将TTF(TrueTypeFonts)字型文字写入图片。
*参数size为字形的尺寸;angle为字型的角度,顺时针计算,0度为水平,也就是三点钟的方向(由左到右),90度则为由下到上的文字;
*x,y二参数为文字的坐标值(原点为左下角);参数col为字的颜色;fontfile为字型文件名称,亦可是远端的文件;
*text当然就是字符串内容了。
返回值为数组,包括了八个元素,头二个分别为左下的x、y坐标,第三、四个为右下角的x、y坐标,第五、六及七、八二组分别为右上及左上的x、y坐标。
*注意的是欲使用本函数,系统要装妥GD及Freetype二个函数库。
*
*返回的内容如:
*0=>;2
*1=>;-1
*2=>;258
*3=>;-1
*4=>;258
*5=>;-20
*6=>;2
*7=>;-20
*//下面的是没用的:
*images_width=266
*images_height=29
*font_width=256
*font_height=19
*font_location_x=5
*font_location_y=-15
*/
$w=$temp[2]-$temp[0];
$h=$temp[1]-$temp[7];
//也可以:
//$w=$temp[2]-$temp[6];
//$h=$temp[3]-$temp[7];
unset($temp);
$label="文字的";
}
//检查水印图片的尺寸是否合适(背景图片必须在长宽上都要大于水印图片)
if(($back_h<$h)||$back_w<$w){
echo"需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!
";
return;
}
//判断选择的水印位置在哪里
switch($waterPos){
case0:
//随机
$posX=rand(0,($back_w-$w));
$posY=rand(0,($back_h-$h));
break;
case1:
//1为顶端居左
$posX=0;
$posY=0;
break;
case2:
//2为顶端居中
$posX=($back_w-$w)/2;
$posX=0;
break;
case3:
//3为顶端居右
$posX=$ground_w-$w;
$posY=0;
break;
case4:
//4为中部居左
$posX=0;
$posY=($back_h-$h)/2;
break;
case5:
//5为中部居中
$posX=($back_w-$w)/2;
$posY=($back_h-$h)/2;
break;
case6:
//6为中部居右
$posX=$back_w-$w;
$posY=($back_h-$h)/2;
break;
case7:
//7为底端居左
$posX=0;
$posY=$back_h-$h;
break;
case8:
//8为底端居中
$posX=($back_w-$w)/2;
$posY=$back_h-$h;
break;
case9:
//9为底端居右
$posX=$back_w-$w;
$posY=$back_h-$h;
break;
default:
//随机
$posX=rand(0,($back_w-$w));
$posY=rand(0,($back_h-$h));
break;
}
//设定图像的混色模式
imagealphablending($back_image,TRUE);
/*
*intimagealphablending(resourceimage,boolblendmode)
*imagealphablending()允许在真彩色图像上使用两种不同的绘画模式。
*在混色(blending)模式,alpha通道色彩成分提供给所有的绘画函数,
*例如imagesetpixel()决定底层的颜色应在何种程度上被允许照射透过。
作为结果,
*GD自动将该点现有的颜色和绘画的颜色混合,并将结果储存在图像中。
*结果的像素是不透明的。
*在非混色模式,绘画颜色连同其alpha通道信息一起被拷贝,替换掉目标像素。
*混色模式在画调色板图像时不可用。
如果blendmode为TRUE,则启用混色模式,否则关闭。
*注:
本函数是PHP4.0.6添加的,需要GD2.0.1。
*/
if($isWaterImage)//图片型水印
{
imagecopy($back_image,$water_image,$posX,$posY,0,0,$water_w,$water_h);//拷贝水印到目标文件
/*
*imagecopy()
*imagecopy()函数用于拷贝图像或图像的一部分,成功返回TRUE,否则返回FALSE。
*语法:
*boolimagecopy(resourcedst_im,resourcesrc_im,intdst_x,intdst_y,intsrc_x,intsrc_y,intsrc_w,intsrc_h)
*参数说明:
参数说明
*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开始)拷贝的高度
*
*/
}
else{
if(!
empty($textColor)&&(strlen($textColor)==7)){
$R=hexdec(substr($textColor,1,2));
$G=hexdec(substr($textColor,3,2));
$B=hexdec(substr($textColor,5));
/*
*hexdec()函数把十六进制转换为十进制。
*/
}else{
die("水印文字颜色格式不正确!
");
}
imagestring($back_image,$textFont,$posX,$posY,$waterText,imagecolorallocate($back_image,$R,$G,$B));
/*
*imagestring--水平地画一行字符串。
*intimagestring(resourceimage,intfont,intx,inty,strings,intcol)
*imagestring()用col颜色将字符串s画到image所代表的图像的x,y座标处(图像的左上角为0,0)。
如果font是1,2,3,4或5,则使用内置字体。
*/
}
//生成水印后的图片
@unlink($backImage);
/*
*unlink()函数删除文件。
*若成功,则返回true,失败则返回false。
*/
switch($back_info[2]){
case1:
imagegif($back_image,$backImage);
/*
*ImageGIF
*建立GIF图型。
*语法:
intimagegif(intim,string[filename]);
*返回值:
整数
*函数种类:
图形处理
*内容说明
*本函数用来建立一张GIF格式图形。
参数im为使用ImageCreate()所建立的图片代码。
参数filename可省略,
*若无本参数filename,则会将图片指接送到浏览器端,记得在送出图片之前要先送出使用Content-type:
image/gif的标头字符串(header)到浏览器端,以顺利传输图片。
*若要使用透明背景的GIF图,也就是GIF89a的格式,需要先使用ImageColorTransparent()配置透明背景。
*本函数产生的GIF图,由于有版权的问题,因此在商业上的使用还要多加考量。
*/
break;
case2:
imagejpeg($back_image,$backImage);
break;
case3:
imagepng($back_image,$backImage);
break;
default:
die($errorMsg);
}
//释放内存
if(isset($water_info))
unset($water_info);
if(isset($water_image))
imagedestroy($water_image);
unset($back_info);
imagedestroy($back_image);
}
//-----------------------------------------------------------------------------
if(!
empty($_FILES)){
$filename=$_FILES['imagefile']['name'];
if(copy($_FILES['imagefile']['tmp_name'],$filename)){
$waterImage="logo.jpg";//水印图片路径
imageWaterMake($filename,5,$waterImage);
echo"";
}else{
echo"no";
}
}
?
>
文件: