因为公司需求 写个小类使用;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));
 */
?>