PHP 图片处理类(图片加水印,图片加文字,图片缩略处理,获取图片信息等)

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);
?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注