PHP 图片处理类(图片加水印,图片加文字,图片缩略处理,获取图片信息等)
<?php
header('content-type:text/html;charset=utf-8');
class Imgs
{
/**
* 取得图片宽
* @param string $src 图片相对路径或绝对路径
*/
public static function get_width($src)
{
return imagesx($src);
}
/**
* 取得图片高
* @param string $src 图片相对路径或绝对路径
*/
public static function get_height($src)
{
return imagesy($src);
}
/**
* 图片缩放函数
* @param string $src 图片相对路径或绝对路径
* @param int $w 缩略图宽
* @param int $h 缩略图高
* @return array code:状态。msg:提示信息
**/
public static function thumb($src,$w=null,$h=null)
{
if(empty($src)) return array('code'=>false , 'msg'=>'请指定$src');
$temp = pathinfo($src);
# 文件名
$name = $temp["basename"];
# 文件所在的文件夹
$dir = $temp["dirname"];
# 文件扩展名
$extension = $temp["extension"];
# 缩略图保存路径,新的文件名为*.thumb.jpg
$savepath = "{$dir}/thumb_{$name}";
# 获取图片的基本信息
$info = getimagesize($src);
# 获取图片宽度
$width = $info[0];
# 获取图片高度
$height = $info[1];
if(!empty($w)){
$temp_w=$w; # 计算原图缩放后的宽度
$temp_h=intval($height*($w/$width));# 计算原图缩放后的高度
}else{
$temp_w=intval($width*($h/$height));# 计算原图缩放后的宽度
$temp_h=$h; # 计算原图缩放后的高度
}
# 创建画布
$temp_img=imagecreatetruecolor($temp_w,$temp_h);
switch ($info[2])
{
case 1:
$im=imagecreatefromgif($src);
imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height);
imagegif($temp_img,$savepath, 100);
break;
case 2:
$im=imagecreatefromjpeg($src);
imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height);
imagejpeg($temp_img,$savepath, 100);
break;
case 3:
$im=imagecreatefrompng($src);
imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height);
imagepng($temp_img,$savepath, 100);
break;
}
imagedestroy($im);
return $savepath;
}
/**
* 图片添加水印
* @param string $src 1、图片相对路径或绝对路径 2、以逗号隔开的宽高值('800,600')
* @param array 属性值:
* res:水印资源(1、图片相对路径或绝对路径,2、字符串)
* pos:图片水印添加的位置,取值范围:0~9
* 0:随机位置,在1~8之间随机选取一个位置
* 1:顶部居左 2:顶部居中
* 3:顶部居右 4:左边居中
* 5:图片中心 6:右边居中
* 7:底部居左 8:底部居中
* 9:底部居右
* font: 字体库(相对路径或绝对路径)
* fontSize:文字大小
* color: 水印文字的字体颜色(255,255,255)
* name: 图片保存名称
* @return array code:状态、 msg:提示信息、 url:图片地址
**/
public static function setWater($src, $arr=array())
{
if(empty($src)) return array('code'=>false , 'msg'=>'请指定$src');
$def = array(
'res' => '小川编程',
'pos' => 7,
'font' => './1.ttf',
'fontSize' => 24,
'color' => '255,255,255',
'name' => null
);
$def = array_merge($def,$arr);
/**
判断$src是不是图片,不是就创建画布
*/
if(!file_exists($src)){
if(empty($def['name'])) return array('code'=>false , 'msg'=>'请指定图片名称');
# 计算画布宽高
$obj = explode(',', $src);
if(count($obj)!=2) return array('code'=>false ,
'msg'=>'请给正确的宽高,或你给的不是一个有效的地址!');
$srcImg_w = is_numeric($obj[0]) ? $obj[0] : 400 ;
$srcImg_h = is_numeric($obj[1]) ? $obj[1] : 300 ;
# 创建画布
$dst_img = @imagecreatetruecolor($srcImg_w,$srcImg_h);
}else{
# 获取图片信息
$srcInfo = @getimagesize($src);
$srcImg_w = $srcInfo[0];
$srcImg_h = $srcInfo[1];
if(empty($def['name'])) $def['name'] = $src;
# 动态的把图片导入内存中
switch ($srcInfo[2]){
case 1:
$dst_img = imagecreatefromgif($src);
break;
case 2:
$dst_img = imagecreatefromjpeg($src);
break;
case 3:
$dst_img = imagecreatefrompng($src);
break;
default:
return array('code'=>false , 'msg'=>'目标图片类型错误');
exit;
}
}
/**
计算出水印宽高
*/
if(!file_exists($def['res'])){
if(!file_exists($def['font']))
return array('code'=>false , 'msg'=>'字体库不存在');
$box = @imagettfbbox($def['fontSize'], 0, $def['font'], $def['res']);
$logow = max($box[2], $box[4]) - min($box[0], $box[6]);
$logoh = max($box[1], $box[3]) - min($box[5], $box[7]);
}else{
$resInfo = @getimagesize($def['res']);
$res_w = $resInfo[0];
$res_h = $resInfo[1];
if($srcImg_w < $res_w || $srcImg_h < $res_h)
return array('code'=>false , 'msg'=>'水印图片过大');
# 动态的把图片导入内存中
switch ($resInfo[2]){
case 1:
$markim = imagecreatefromgif($def['res']);
break;
case 2:
$markim = imagecreatefromjpeg($def['res']);
break;
case 3:
$markim = imagecreatefrompng($def['res']);
break;
default:
return array('code'=>false , 'msg'=>'水印图片类型错误');
exit;
}
$logow = $res_w;
$logoh = $res_h;
}
/**
计算水印显示位置
*/
if($def['pos'] == 0) $def['pos'] = rand(1, 9);
switch($def['pos'])
{
case 1:
$x = +10;
$y = +10+$def['fontSize'];
break;
case 2:
$x = ($srcImg_w - $logow) / 2;
$y = +10+$def['fontSize'];
break;
case 3:
$x = $srcImg_w - $logow - 10;
$y = +10+$def['fontSize'];
break;
case 4:
$x = +10;
$y = ($srcImg_h - $logoh) / 2 + $def['fontSize'];
break;
case 5:
$x = ($srcImg_w - $logow) / 2;
$y = ($srcImg_h - $logoh) / 2 + $def['fontSize'];
break;
case 6:
$x = $srcImg_w - $logow - 10;
$y = ($srcImg_h - $logoh) / 2 + $def['fontSize'];
break;
case 7:
$x = +10;
$y = $srcImg_h - $logoh + $def['fontSize'] - 10;
break;
case 8:
$x = ($srcImg_w - $logow) / 2;
$y = $srcImg_h - $logoh + $def['fontSize'] - 10;
break;
case 9:
$x = $srcImg_w - $logow - 10;
$y = $srcImg_h - $logoh + $def['fontSize'] - 10;
break;
default:
return array('code'=>false , 'msg'=>'水印位置不支持');
exit;
}
/**
把图片水印或文字水印,加到目标图片中
*/
if(file_exists($def['res'])){
imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);
imagedestroy($markim);
}else{
$rgb = explode(',', $def['color']);
if(count($rgb)!=3) return array('code'=>false , 'msg'=>'请给正确的字体颜色');
if(!is_numeric($rgb[0]) || !is_numeric($rgb[1]) || !is_numeric($rgb[2]))
return array('code'=>false , 'msg'=>'请给正确的字体颜色');
if($rgb[0]>255 || $rgb[1]>255 || $rgb[2]>255)
return array('code'=>false , 'msg'=>'请给正确的字体颜色');
$def['color'] = imagecolorallocate($dst_img, $rgb[0], $rgb[1], $rgb[2]);
imagettftext($dst_img, $def['fontSize'], 0, $x,
$y, $def['color'], $def['font'],$def['res']);
}
/**
保存处理过的图片(有水印了的图片)
*/
$name = explode('.', $def['name']);
switch (strtolower($name[2])) {
case 'jpeg':
imagejpeg($dst_img, $def['name']);
break;
case 'jpg':
imagejpeg($dst_img, $def['name']);
break;
case 'png':
imagepng($dst_img, $def['name']);
break;
case 'gif':
imagegif($dst_img, $def['name']);
break;
default:
return array('code'=>false , 'msg'=>'保存图片类型有误');
break;
}
# 销毁图片内存资源
imagedestroy($dst_img);
return array('code'=>true , 'msg'=>'添加水印成功', 'url'=>$def['name']);
}
}
/*
创建一个800*600的图再加logo.jpg图片作为水印.
1、另存为new_thumb.jpeg
2、水印在中间显示
*/
# 参数:
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => './logo.jpg',
# 水印显示位置
'pos' => 5,
# 不指定name(会覆盖原图,也就是保存成thumb.jpeg)
'name' => './800x600.jpeg',
];
$res = Imgs::setWater('800,600', $arr);
print_r($res);
/*
给图片thumb.jpeg加:小川编程,作为水印
1、另存为new_thumb.jpeg
2、水印顶部居右显示
3、字体大小为:30
*/
# 参数:
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => '小川编程',
# 水印显示位置
'pos' => 3,
# 不指定name(会覆盖原图,也就是保存成thumb.jpeg)
'name' => './new1.jpg',
# 字体大小
'fontSize'=>30,
# 字体颜色
'color'=>'255,255,0',
];
$res = Imgs::setWater('./1.jpg', $arr);
print_r($res);
?>转载请注明来源地址:小川编程 » https://www.youhutong.com/index.php/article/index/165.html
1、本站发布的内容仅限用于学习和研究目的.请勿用于商业或非法用途,下载后请24小时内删除。
2、本站所有内容均不能保证其完整性,不能接受请勿购买或下载,如需完整程序,请去其官方购买正版使用
3、本站联系方式Email:admin@youhutong.com ,收到邮件会第一时间处理。
4、如侵犯到任何版权问题,请立即告知本站(立即在线告知),本站将及时删除并致以最深的歉意
