因为公司需求 写个小类使用;v02版报错机制已加,尚未补充错误显示
<?php
/**
* 前提:php安装GD2 处理文件大小不能超过php.ini的设置的内存
* @Description 图像处理类:1、thumb 缩放 2、water_p_w_picpath 图片水印 3、water_text 文字水印
* @author haoyanfei
* @copyright (c) 2013-05-14, haoyanfei
* @param string $img
* @param allow type : gif|jpg|png|bmp
* @param $memory_limit 处理图片的内存限制 单位:MB 推荐填写上
* @return string $filename 暂时仅支持自己命名文件名,不分配随机规则 如test.jpg;
* @example bottom
*/
/*
*版本说明 修改 1.初始化的bug
*2.缩放 放大缩小判断条件Bug
*/
class ImageMark {
//限制处理图片内存
protected $memory_limit;
//当前图片
protected $img;
//图片types对应表
protected $types = array(
1 => 'gif',
2 => 'jpg',
3 => 'png',
6 => 'bmp'
);
//p_w_picpath
public function __construct($img = '') {
$img && $this->param($img);
!$this->memory_limit && $this->memory_limit = ini_get('memory_limit');
}
//info
public function param($img) {
$this->img = $img;
return $this;
}
/*
* Description p_w_picpathInfo
* 获取图片信息 判定格式 大小是否合乎要求
* @param string $img 图片的路径
* @return array('ext' => ? ,'type' => ? ,'size' => ? );
*
*/
public function getImageInfo($img) {
//根据性能 考虑是否进行判断
$info = @getp_w_picpathsize($img);
if (isset($info[2]) && array_key_exists($info[2], $this->types)) {
$info['ext'] = $info['type'] = $this->types[$info[2]];
} else {
//TODO 1文件格式不合要求,是否为jpg|png|gif|bmp
//TODO 2不能访问指定的图像或者其不是有效的图像
// die('不能访问指定图像或其不是有效图像');
return false;
//$info['ext'] = $info['type'] = 'jpg';
}
$info['type'] == 'jpg' && $info['type'] = 'jpeg';
//此时 $img是存在的 否则执行不到此步
$info['size'] = @filesize($img);
//判断处理的图片大小是否在允许范围
if ($info['size'] / pow(1024, 2) > $this->memory_limit) {
// die('超出内存限制');
return false;
}
return $info;
}
/*
* 判断文件路径是否存在
* 可以作为扩展使用:分为系统分配命名|用户分配命名
*/
private function is_exisit($filename) {
//判断$filename 是否有效
$path = pathinfo($filename);
if (!file_exists($path['dirname'])) {
die('请确认文件存在并可写?');
}
}
/*
* @auth haoyanfei<haoyanfei@zkwsr.com>
* @version v001 2013-04-17
* @param string $filename 存储文件名
* @param int $new_w 缩放图的宽
* @param int $new_h 缩放图的高
* @parem int $cur 切割规则: 1、等比例 2、中部裁剪 3、左上裁剪
* @param int $big 放大or缩小? 0、缩小 1、放大
*/
public function thumb($filename, $new_w = 160, $new_h = 120, $cut = 0, $big = 0) {
//判断$filename 是否有效
$this->is_exisit($filename);
//获取原图信息
$info = $this->getImageInfo($this->img);
if (!empty($info[0])) {
$old_w = $info[0];
$old_h = $info[1];
$type = $info['type'];
$ext = $info['ext'];
unset($info);
//如果原图比缩略图小,是否允许放大
if ($old_w < $new_w || $old_h < $new_h || $big ) {
//TODO 3如果原图比缩略图小,并且不允许放大
return false;
// die('原图比缩略图小,并且不允许放大');
}
//裁剪图片
if ($cut === 0) {
//等比例
$scale = min($new_w / $old_w, $new_h / $old_h); //计算缩放比例
$width = (int) ($old_w * $scale);
$height = (int) ($old_h * $scale);
$start_w = $start_h = 0;
$end_w = $old_w;
$end_h = $old_h;
} elseif ($cut == 1) {
//center center 裁剪
$scale1 = round($new_w / $new_h, 2);
$scale2 = round($old_w / $old_h, 2);
if ($scale1 > $scale2) {
$end_h = round($old_w / $scale1, 2);
$start_h = ($old_h - $end_h) / 2;
$start_w = 0;
$end_w = $old_w;
} else {
$end_w = round($old_h * $scale1, 2);
$start_w = ($old_w - $end_w) / 2;
$start_h = 0;
$end_h = $old_h;
}
$width = $new_w;
$height = $new_h;
} elseif ($cut == 2) {
//left top 裁剪
$scale1 = round($new_w / $new_h) / 2;
$scale2 = round($old_w / $old_h) / 2;
if ($scale1 > $scale2) {
$end_h = round($old_w / $scale1, 2);
$end_w = $old_w;
} else {
$end_w = round($old_h * $scale1, 2);
$end_h = $old_h;
}
$start_w = 0;
$start_h = 0;
$width = $new_w;
$height = $new_h;
} else {
//TODO 4(无此规则)扩展缩放规则
// die('无此方法');
return false;
}
//载入原图
$createFun = 'p_w_picpathcreatefrom' . $type;
$oldimg = $createFun($this->img);
//创建缩略图
// if ($type != 'gif' && function_exists('p_w_picpathcreatetruecolor')) {
if (function_exists('p_w_picpathcreatetruecolor')) {
$newimg = p_w_picpathcreatetruecolor($width, $height);
} else {
$newimg = p_w_picpathcreate($width, $height);
}
//复制图片,并调整大小
if (function_exists('p_w_picpathcopyresampled')) {
p_w_picpathcopyresampled($newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h);
} else {
p_w_picpathcopyresized($newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h);
}
//对jpeg图形 设置隔行扫描
$type == 'jpeg' && p_w_picpathinterlace($newimg, 1);
//生成图片
$p_w_picpathFun = 'p_w_picpath' . $type;
!@$p_w_picpathFun($newimg, $filename) && die('保存失败,检查目录是否存在并且可写?');
p_w_picpathdestroy($newimg);
p_w_picpathdestroy($oldimg);
return $filename;
}
return false;
}
/*
* 图片水印
* @auth haoyanfei<haoyanfei@zkwsr.com>
* @version v001 2013-04-17
* @param string $filename 存储文件名
* @param string $filename 保存位置
* @param string $water 水印图片
* @param string $pos 水印位置 0-9;自定义位置 index arrray $pos = ('width' ,'height')
* @param string $pct 透明度
*/
public function water_p_w_picpath($filename, $water = '', $pos = '') {
//TODO 5验证文件存在
$this->is_exisit($filename);
//加载背景图片 $oldimg 资源
$info_old = $this->getImageInfo($this->img);
if (!empty($info_old)) {
$old_w = $info_old[0];
$old_h = $info_old[1];
$type_old = $info_old['type'];
$fun = 'p_w_picpathcreatefrom' . $type_old;
$oldimg = $fun($this->img);
} else {
//TODO 6获取背景图资源信息失败 getImageInfo()方法已经详细判断过 此处不再提示错误
return false;
}
//加载水印图片 $waterimg 资源
$info_water = $this->getImageInfo($water);
if (!empty($info_water)) {
$water_w = $info_water[0];
$water_h = $info_water[1];
$type = $info_water['type'];
$fun = 'p_w_picpathcreatefrom' . $type;
$waterimg = $fun($water);
} else {
//TODO 7获取水印图资源信息失败 getImageInfo()方法已经详细判断过 此处不再提示错误
return false;
}
//剪切水印
//TODO 8校验 宽高
if ($old_w < $water_w || $old_h < $water_h) {
// die('水印宽高大于背景图宽高');
return false;
}
//水印的位置
$posArr = $this->setPosition($pos, $old_w, $old_h, $water_w, $water_h);
//设定图像的混色模式
// p_w_picpathalphablending($oldimg, true);
//添加水印
p_w_picpathcopy($oldimg, $waterimg, $posArr['x'], $posArr['y'], 0, 0, $water_w, $water_h);
//保存
$fun = 'p_w_picpath' . $type_old;
!@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并可写?');
//销毁
p_w_picpathdestroy($oldimg);
p_w_picpathdestroy($waterimg);
return $filename;
}
/*
* 画个矩形图
* @param array $posTL = array();
* @param array $posBR = array();
* @param array $color = array();
* @return boolean true?false
*/
public function rectangle($filename, $posTL, $posBR, $color) {
//加载背景图片 $oldimg 资源
$info_old = $this->getImageInfo($this->img);
if (!empty($info_old)) {
$old_w = $info_old[0];
$old_h = $info_old[1];
$type = $info_old['type'];
$fun = 'p_w_picpathcreatefrom' . $type;
$oldimg = $fun($this->img);
} else {
//TODO 6获取背景图资源信息失败 getImageInfo()方法已经详细判断过 此处不再提示错误
return false;
}
$col = p_w_picpathcolorallocate($oldimg, $color[0], $color[1], $color[2]);
p_w_picpathfilledrectangle($oldimg, $posTL[0], $posTL[1], $posBR[0], $posBR[1], $col);
//保存
$fun = 'p_w_picpath' . $type;
!@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并可写?');
//销毁
p_w_picpathdestroy($oldimg);
return $filename;
}
/*
* 文字水印
* @auth haoyanfei<haoyanfei@zkwsr.com>
* @version v001 2013-04-17
* @param string $filename 存储文件名
* @param string $font 字体 .ttf文件
* @param string $text 文本
* @param string $size 字体大小
* @param string $color 字体颜色的设置
* @param val $text_pos 0-9 array自定义位置
*/
public function water_font($filename, $font, $text, $text_pos, $size, $color) {
//TODO 9文件是否存在并可写?
$this->is_exisit($filename);
//加载背景图片 $oldimg 资源
$info = $this->getImageInfo($this->img);
if (!empty($info)) {
$old_w = $info[0];
$old_h = $info[1];
$type = $info['type'];
$fun = 'p_w_picpathcreatefrom' . $type;
$oldimg = $fun($this->img);
} else {
//TODO 10获取背景资源信息失败 getImageInfo()方法已经详细判断过 此处不再提示错误
return false;
}
//字体处理
//取得此字体的文本的范围
$temp = p_w_picpathttfbbox($size, 0, $font, $text);
$font_w = $temp[2] - $temp[0];
$font_h = $temp[1] - $temp[7];
unset($temp);
//TODO 11校验 宽高
if ($old_w < $font_w || $old_h < $font_h) {
// die('水印宽高大于背景图宽高');
return false;
}
$posArr = $this->setPosition($text_pos, $old_w, $old_h, $font_w, $font_h);
// 打印文本
$red = p_w_picpathcolorallocate($oldimg, $color[0], $color[1], $color[2]);
p_w_picpathttftext($oldimg, intval($size), 0, intval($posArr['x']), intval($posArr['y']), $red, $font, $text);
//保存
$fun = 'p_w_picpath' . $type;
!@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并可写?');
//销毁
p_w_picpathdestroy($oldimg);
return $filename;
}
/*
* 设置位置
* @param $pos
* @param $old_w
* @param $old_h
* @param $water_w
* @param $water_h
* return 0 随机
*/
private function setPosition($pos = '', $old_w = '', $old_h = '', $water_w = '', $water_h = '') {
//如果是数组 直接 定位
if (is_array($pos)) {
$posX = $pos[0];
$posY = $pos[1];
} else {
switch ($pos) {
case 1 ://顶部居左
$posX = 0;
$posY = 0;
break;
case 2 ://顶部居中
$posX = ($old_w - $water_w) / 2;
$posY = 0;
break;
case 3 : // 顶部居右
$posX = ($old_w - $water_w) / 2;
$posY = ($old_h - $water_h) / 2;
break;
case 4://4为中部居左
$posX = 0;
$posY = ($old_h - $water_h) / 2;
break;
case 5://5为中部居中
$posX = ($old_w - $water_w) / 2;
$posY = ($old_h - $water_h) / 2;
break;
case 6://6为中部居右
$posX = $old_w - $water_w;
$posY = ($old_h - $water_h) / 2;
break;
case 7://7为底端居左
$posX = 0;
$posY = $old_h - $water_h;
break;
case 8://8为底端居中
$posX = ($old_w - $water_w) / 2;
$posY = $old_h - $water_h;
break;
case 9://9为底端居右
$posX = $old_w - $water_w;
$posY = $old_h - $water_h;
break;
default://随机
$posX = rand(0, ($old_w - $water_w));
$posY = rand(0, ($old_h - $water_h));
break;
}
}
return array('x' => $posX, 'y' => $posY);
}
}
// $img = new p_w_picpathManage();
//等比例缩放
// $img->param('./12.jpg')->thumb('./p_w_picpaths/thumb_1.jpg',320,240);
//图片水印
/*
$bool1 = $img->param('2.jpg')->water_p_w_picpath('./p_w_picpaths/water_1.jpg', './p_w_picpaths/thumb_1.jpg', array(500, 500));
//$filename,$font, $text, $size, $color
//文字水印
$str = '这个是对的嘛 也许的 可能本来就是额 你认为的呐';
$img->param('2.jpg')->water_font('./p_w_picpaths/text_1.jpg', 'simhei.ttf', $str, array(200, 200), 20, array(255, 0, 0));
*/
?>
转载于:https://blog.51cto.com/haoyanfei/1200213