PHP添加PNG图片背景透明水印操作类定义与用法示例
本文实例讲述了PHP添加PNG图片背景透明水印操作类定义与用法。分享给大家供大家参考,具体如下:
图片相关操作类
classImageTool
{
private$imagePath;//图片路径
private$outputDir;//输出文件夹
public$memoryImg;//内存图像
public$path;
publicfunction__construct($imagePath,$outputDir=null)
{
$this->imagePath=$imagePath;
$this->outputDir=$outputDir;
$this->memoryImg=null;
$this->path=null;
}
/**
*显示内存中的图片
*@param$image
*/
publicfunctionshowImage()
{
if($this->memoryImg!=null){
$info=getimagesize($this->imagePath);
$type=image_type_to_extension($info[2],false);
header('Content-type:'.$info['mime']);
$funs="image{$type}";
$funs($this->memoryImg);
imagedestroy($this->memoryImg);
$this->memoryImg=null;
}
}
/**
*保存图片
*@param$image图片路径
*@returnstring
*/
privatefunctionsaveImage($image)
{
$info=getimagesize($this->imagePath);
$type=image_type_to_extension($info[2],false);
$funs="image{$type}";
if(empty($this->outputDir)){
$funs($image,md5($this->imagePath).'.'.$type);
returnmd5($this->imagePath).'.'.$type;
}else{
$funs($image,$this->outputDir.md5($this->imagePath).'.'.$type);
return$this->outputDir.md5($this->imagePath).'.'.$type;
}
}
/**
*压缩图片
*@param$width压缩后宽度
*@param$height压缩后高度
*@parambool$output是否输出文件
*@returnresource
*/
publicfunctioncompressImage($width,$height,$output=false)
{
$image=null;
$info=getimagesize($this->imagePath);
$type=image_type_to_extension($info[2],false);
$fun="imagecreatefrom{$type}";
$image=$fun($this->imagePath);
imagesavealpha($image,true);//
$thumbnail=imagecreatetruecolor($width,$height);
imagealphablending($thumbnail,false);//这里很重要,意思是不合并颜色,直接用$img图像颜色替换,包括透明色;
imagesavealpha($thumbnail,true);//
imagecopyresampled($thumbnail,$image,0,0,0,0,$width,$height,$info[0],$info[1]);
imagedestroy($image);
if($output){
$path=$this->saveImage($thumbnail);
$this->path=$path;
}
$this->memoryImg=$thumbnail;
return$this;
}
/**
*为图像添加文字标记
*
*@param$content文本内容
*@param$size字体大小
*@param$font字体样式
*@parambool$output是否输出文件
*@return$this
*/
publicfunctionaddTextmark($content,$size,$font,$output=false)
{
$info=getimagesize($this->imagePath);
$type=image_type_to_extension($info[2],false);
$fun="imagecreatefrom{$type}";
$image=$fun($this->imagePath);
$color=imagecolorallocatealpha($image,0,0,0,80);
$posX=imagesx($image)-strlen($content)*$size/2;
$posY=imagesy($image)-$size/1.5;
imagettftext($image,$size,0,$posX,$posY,$color,$font,$content);
if($output){
$this->saveImage($image);
}
$this->memoryImg=$image;
return$this;
}
/**
*为图片添加水印
*
*@param$watermark水印图片路径
*@param$alpha水印透明度(0-100)
*@parambool$output是否输出文件
*@return$this
*/
publicfunctionaddWatermark($watermark,$alpha,$output=false)
{
$image_info=getimagesize($this->imagePath);
$image_type=image_type_to_extension($image_info[2],false);
$image_fun="imagecreatefrom{$image_type}";
$image=$image_fun($this->imagePath);
$mark_info=getimagesize($watermark);
$mark_type=image_type_to_extension($mark_info[2],false);
$mark_fun="imagecreatefrom{$mark_type}";
$mark=$mark_fun($watermark);
$posX=imagesx($image)-imagesx($mark);
$posY=imagesy($image)-imagesy($mark);
imagesavealpha($mark,true);
imagecopymerge($image,$mark,$posX,$posY,0,0,$mark_info[0],$mark_info[1],$alpha);
imagesavealpha($mark,true);
if($output){
$path=$this->saveImage($image);
$this->path=$path;
}
$this->memoryImg=$image;
return$this;
}
//用给定角度旋转图像,以jpeg图像格式为例
/**
*水印图片旋转
*@param$degrees旋转角度
*@parambool$output是否保存图片
*@return$this
*/
functionrotateImage($degrees,$output=false)
{
$info=getimagesize($this->imagePath);
$type=image_type_to_extension($info[2],false);
$fun="imagecreatefrom{$type}";
$image=$fun($this->imagePath);
$block=imagecreatetruecolor(170,170);//建立一个画板
$bg=imagecolorallocatealpha($block,0,0,0,127);//拾取一个完全透明的颜色
$image=imagerotate($image,$degrees,$bg,0);
imagesavealpha($image,true);
header("Content-type:image/{$type}");
//旋转后的图片保存
if($output){
$path=$this->saveImage($image);
$this->path=$path;
}
$this->memoryImg=$image;
return$this;
}
/**
*添加PNG透明图片
*$bigImgPath目标图片路径
*$smallImgPath水印图片路径
*$width相对于目标图的x轴放置位置左上角为0
*$height相对于目标图的y轴放置位置左上角为0
*$bigImgPaths合成后的图片路径若路径名与第一张或第二张路径相同直接覆盖原图
*/
publicfunctionmergerImg($bigImgPath,$smallImgPath,$width,$height,$bigImgPaths)
{
$image_kuang=imagecreatefromstring(file_get_contents($smallImgPath));
$image_photo=imagecreatefromstring(file_get_contents($bigImgPath));
//创建一个新的,和大图一样大的画布
$image_3=imageCreatetruecolor(imagesx($image_photo),imagesy($image_photo));
//为真彩色画布创建白色背景,再设置为透明
$color=imagecolorallocate($image_3,255,255,255);
imagefill($image_3,0,0,$color);
imageColorTransparent($image_3,$color);
/**
*先copy图片,再copy画框,实现png的透明效果,将图片嵌入到画框里
*imagecopymerge与imagecopy的不同:
*imagecopymerge函数可以支持两个图像叠加时,设置叠加层的透明度。imagecopymerge比imagecopy多一个参数,来设置透明度
*PHP内部源码里,imagecopymerge在透明度参数为100时,直接调用imagecopy函数。
*imagecopy函数则不支持叠加透明,但拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝
*即:使用imagecopymerge函数,可以实现打上透明度为30%的淡淡的水印图标,但图片本身的png就会变得像IE6不支持png透明那样,背景不透明了。
*如果使用imagecopy函数,可以保留图片本身的透明信息,但无法实现30%的淡淡水印叠加,
*/
imagecopyresampled($image_3,$image_photo,0,0,0,0,imagesx($image_photo),imagesy($image_photo),imagesx($image_photo),imagesy($image_photo));
imagecopy($image_3,$image_kuang,$width,$height,0,0,imagesx($image_kuang),imagesy($image_kuang));
//存储图片路径
imagejpeg($image_3,$bigImgPaths);
return$bigImgPaths;
}
}
控制器调用方法
publicfunctiontest()
{
$bigImgPath='ren.jpg';//原图路径
$waterImgPath='tae.png';//水印图路径
$imageTool=newImageTool($waterImgPath,'tmp/');//图片路径、输出文件夹
$smallImgPath=$imageTool->rotateImage(45,true)->path;//旋转
$width=0;//水印所在X坐标
$height=0;//水印所在Y坐标
$bigImgPaths='new.png';//生成原图加水印新图路径
$path=$this->mergerImg($bigImgPath,$smallImgPath,$width,$height,$bigImgPaths);
returnview('image',compact('path'));
}
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。