//
图像处理类:
功能:实现图片的多位置加水印,随机加水印,图片等比缩放。
<?php
class image{
//成员属性
private $path;//传入的路径
//初始化构造方法,默认为当前文件夹的路径
public function __construct($path='./'){
$this->path=rtrim($path,'/').'/';//去掉路径右边的/ 然后添加一个反斜杠,为了防止误操作
}
//定义一个水印方法,参数有背景图水印图,水印位置,透明度,前缀
public function water($background,$water,$pos=0,$pol=100,$prefix='wa_'){
$background=$this->path.$background;//将图片与路径拼接
$water=$this->path.$water;
if(file_exists($background) && file_exists($water)){//判断水印图片与背景图片是否存在
$backInfo=self::getImageInfo($background);//获取图片的信息
$waterInfo=self::getImageInfo($water);
if(!self::checkSize($backInfo,$waterInfo)){//判断水印图是否大于背景图
echo '水印图片大于背景图片';
return false;
}
$position=self::getPosition($backInfo,$waterInfo,$pos);//获得图片位置
if(!$backRes = self::openImg($background,$backInfo['type'])){//打开图片
echo '背景图片打开失败';
return false;
}
if(!$waterRes=self::openImg($water,$waterInfo['type'])){
echo '水印图片打开失败';
return false;
}
$newRes=self::mergeImg($backRes,$waterRes,$position,$waterInfo,$pol);//合并图片
if($path=self::save($this->path,$newRes,$backInfo,$prefix)){//保存图片
self::des($backRes);
self::des($waterRes);
return false;
}else{
echo '保存图片失败';
return false;
}
}else{
echo '背景图片或者水印图片没有找到';
return false;
}
}
//合并图片的方法
static private function mergeImg($b,$w,$p,$info,$pol){
imagecopymerge($b,$w,$p['x'],$p['y'],0,0,$info['width'],$info['height'],$pol);
return $b;
}
//获得图片属性的方法
static private function getImageInfo($img){
$info=getimagesize($img);//使用获得图片信息的函数
//将所有的信息放入一个数组
$date['width']=$info[0];
$date['height']=$info[1];
$date['type']=$info['mime'];
$date['name']=basename($img);//使用函数返回路径中的文件名部分
return $date;
}
//打开图片的方法
static private function openImg($img,$type){
switch($type){
case 'image/jpeg':
case 'image/jpg':
case 'image/pjpeg':
$res=imagecreatefromjpeg($img);
break;
case 'image/png':
case 'image/x-png':
$res=imagecreatefrompng($img);
break;
case 'image.gif':
$res=imagecreatefromgif($img);
break;
case 'image/wbmp':
$res=imagecreatefromwbmp($img);
break;
default:
$res=false;
}
return $res;
}
/*========================== 图片的等比缩放方法============================*/
public function thumb($background,$width,$height,$prefix='th_'){
$background=$this->prefix.$background;
if(!file_exists($background)){
echo '背景图片不存在';
return false;
}
$backInfo=self::getImageInfo($background);
$newSize=self::getNewSize($width,$height,$backInfo);
$res=self::openImg($background,$backInfo['type']);
$newRes=self::kidOfImage($res,$newSize,$backInfo);
if($path=self::save($this->path,$newRes,$backInfo,$prefix)){
self::des($newRes);
return $path;
}
}
static private function kidOfImage($srcImg,$size, $imgInfo){
$newImg = imagecreatetruecolor($size["width"], $size["height"]);
$otsc = imagecolortransparent($srcImg);
if( $otsc >= 0 && $otsc < imagecolorstotal($srcImg)) {
$transparentcolor = imagecolorsforindex( $srcImg, $otsc );
$newtransparentcolor = imagecolorallocate(
$newImg,
$transparentcolor['red'],
$transparentcolor['green'],
$transparentcolor['blue']
);
imagefill( $newImg, 0, 0, $newtransparentcolor );
imagecolortransparent( $newImg, $newtransparentcolor );
}
imagecopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"],
$imgInfo["width"], $imgInfo["height"] );
imagedestroy($srcImg);
return $newImg;
}
static private function getNewSize($width, $height,$imgInfo){
$size["width"]=$imgInfo["width"]; //将原图片的宽度给数组中的$size["width"]
$size["height"]=$imgInfo["height"];//将原图片的高度给数组中的$size["height"]
if($width < $imgInfo["width"]){
$size["width"]=$width;//缩放的宽度如果比原图小才重新设置宽度
}
if($width < $imgInfo["height"]){
$size["height"]=$height;//缩放的高度如果比原图小才重新设置高度
}
if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]){
$size["height"]=round($imgInfo["height"]*$size["width"]/$imgInfo["width"]);
}else{
$size["width"]=round($imgInfo["width"]*$size["height"]/$imgInfo["height"]);
}
return $size;
}
/*=============================图片缩放结束==============================*/
//获得水印图片位置的方法
static private function getPosition($b,$w,$p){
switch($p){
case 1://在x为0 y为 0 的情况
$x=0;
$y=0;
break;
case 2://x轴在中间 Y为0
$x=ceil(($b['width']-$w['width'])/2);
$y=0;
break;
case 3:
$x=$b['width']-$w['width'];//背景宽-水印宽
$y=0;
break;
case 4:
$x=0;
$y=ceil(($b['height']-$w['height'])/2);
break;
case 5:
$x=ceil(($b['width']-$w['width'])/2);
$y=ceil(($b['height']-$w['height'])/2);
break;
case 6:
$x=$b['width']-$w['width'];
$y=ceil(($b['height']-$w['height'])/2);
break;
case 7:
$x=0;
$y=$b['height']-$w['height'];//背景高-水印高
break;
case 8:
$x=ceil(($b['width']-$w['width'])/2);
$y=$b['height']-$w['height'];
break;
case 9:
$x=$b['width']-$w['width'];
$y=$b['height']-$w['height'];
break;
default:
$x=mt_rand(0,$b['width']-$w['width']);
$y=mt_rand(0,$b['height']-$w['height']);
break;
}
//我们将图片的位置以数组的形式返回
return array('x'=>$x,'y'=>$y);
}
//检测水印图片的大小是否大于背景图,填入背景图与水印图的INFO
static function checkSize($b,$m){
if($b['width']<=$w['width'] || $b['height']<=$w['height']){
//水印图片大或者于背景图片返回假
return false;
}else{
//否则返回真
return true;
}
}
//保存图片的方法
static private function save($path,$res,$info,$prefix){
$path=$path.$prefix.$info['name'];
switch($info['type']){
case 'image/jpeg':
case 'image/jpg':
case 'image/pjpeg':
$res=imagejpeg($res,$path);
break;
case 'image/png':
case 'image/x-png':
$res=imagejpeg($res,$path);
break;
case 'image.gif':
$res=imagegif($res,$path);
break;
case 'image/wbmp':
$res=imagewbmp($res,$path);
break;
}
return $path;
}
//销毁图片的方法
static private function des($res){
imagedestroy($res);
}
}
?>
云南然成科技有限公司是一家本土的云南软件开发公司,公司成立于2015年初,2017年获得云南省科技厅、省财政厅、省国税局、地税局等机构认定的高新技术企业。公司定位于高端网站设计、系统开发、APP开发、微信公众号、微信小程序开发。拥有多个软著权,公司先后为多家事业单位提供服务,比如会泽文化馆、宣威文化馆、中科院昆明植物研究所等。其中中国科学院昆明植物研究所已经进行了长达4年的合作,并且还持续合作中!