因为公司需求 写个小类使用;v02版报错机制已加,尚未补充错误显示
<?php /** * 前提:php安装GD2 处理文件大小不能超过php.ini的设置的内存 * @Description 图像处理类:1、thumb 缩放 2、water_image 图片水印 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' ); //image 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 imageInfo * 获取图片信息 判定格式 大小是否合乎要求 * @param string $img 图片的路径 * @return array('ext' => ? ,'type' => ? ,'size' => ? ); * */ public function getImageInfo($img) { //根据性能 考虑是否进行判断 $info = @getimagesize($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<[email protected]> * @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 = 'imagecreatefrom' . $type; $oldimg = $createFun($this->img); //创建缩略图 // if ($type != 'gif' && function_exists('imagecreatetruecolor')) { if (function_exists('imagecreatetruecolor')) { $newimg = imagecreatetruecolor($width, $height); } else { $newimg = imagecreate($width, $height); } //复制图片,并调整大小 if (function_exists('imagecopyresampled')) { imagecopyresampled($newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h); } else { imagecopyresized($newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h); } //对jpeg图形 设置隔行扫描 $type == 'jpeg' && imageinterlace($newimg, 1); //生成图片 $imageFun = 'image' . $type; !@$imageFun($newimg, $filename) && die('保存失败,检查目录是否存在并且可写?'); imagedestroy($newimg); imagedestroy($oldimg); return $filename; } return false; } /* * 图片水印 * @auth haoyanfei<[email protected]> * @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_image($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 = 'imagecreatefrom' . $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 = 'imagecreatefrom' . $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); //设定图像的混色模式 // imagealphablending($oldimg, true); //添加水印 imagecopy($oldimg, $waterimg, $posArr['x'], $posArr['y'], 0, 0, $water_w, $water_h); //保存 $fun = 'image' . $type_old; !@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并可写?'); //销毁 imagedestroy($oldimg); imagedestroy($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 = 'imagecreatefrom' . $type; $oldimg = $fun($this->img); } else { //TODO 6获取背景图资源信息失败 getImageInfo()方法已经详细判断过 此处不再提示错误 return false; } $col = imagecolorallocate($oldimg, $color[0], $color[1], $color[2]); imagefilledrectangle($oldimg, $posTL[0], $posTL[1], $posBR[0], $posBR[1], $col); //保存 $fun = 'image' . $type; !@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并可写?'); //销毁 imagedestroy($oldimg); return $filename; } /* * 文字水印 * @auth haoyanfei<[email protected]> * @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 = 'imagecreatefrom' . $type; $oldimg = $fun($this->img); } else { //TODO 10获取背景资源信息失败 getImageInfo()方法已经详细判断过 此处不再提示错误 return false; } //字体处理 //取得此字体的文本的范围 $temp = imagettfbbox($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 = imagecolorallocate($oldimg, $color[0], $color[1], $color[2]); imagettftext($oldimg, intval($size), 0, intval($posArr['x']), intval($posArr['y']), $red, $font, $text); //保存 $fun = 'image' . $type; !@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并可写?'); //销毁 imagedestroy($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 imageManage(); //等比例缩放 // $img->param('./12.jpg')->thumb('./images/thumb_1.jpg',320,240); //图片水印 /* $bool1 = $img->param('2.jpg')->water_image('./images/water_1.jpg', './images/thumb_1.jpg', array(500, 500)); //$filename,$font, $text, $size, $color //文字水印 $str = '这个是对的嘛 也许的 可能本来就是额 你认为的呐'; $img->param('2.jpg')->water_font('./images/text_1.jpg', 'simhei.ttf', $str, array(200, 200), 20, array(255, 0, 0)); */ ?>