您的位置:首页 > 编程语言 > PHP开发

PHP图像处理:缩略图,打水印,裁剪等功能

2013-09-06 00:00 597 查看
PHP用基本的GD和Image函数就可以实现很多处理图片的功能。用多了开源类库,也不能把基础给忘了。
PHP生成缩略图和打水印原理:
<?php
header('Content-Type: image/png');
//打水印主要用到imagecopy,它将小图片复制到大图片上
function watermark($bigimg, $smallimg, $coord = 1) {
//等同于 imagecreate 函数,只不过这里创建的不是一个空图片。 
    $bi = getimagesize($bigimg);
    switch ($bi[2]) {
        case 1:
            $im1 = imagecreatefromgif($bigimg);
            break;
        case 2;
            $im1 = imagecreatefromjpeg($bigimg);
            break;
        case 3;
            $im1 = imagecreatefrompng($bigimg);
            break;
    }
    $si = getimagesize($smallimg);
    switch ($si[2]) {
        case 1:
            $im2 = imagecreatefromgif($smallimg);
            break;
        case 2;
            $im2 = imagecreatefromjpeg($smallimg);
            break;
        case 3;
            $im2 = imagecreatefrompng($smallimg);
            break;
    }
    //将源图片拷贝到目标图片上
    switch ($coord) {
        case 1:
            imagecopy($im1, $im2, 0, 0, 0, 0, $si[0], $si[1]);
            break;
        case 2:
            imagecopy($im1, $im2, $bi[0] - $si[0], 0, 0, 0, $si[0], $si[1]);
            break;
        case 3:
            imagecopy($im1, $im2, $bi[0] - $si[0], $bi[1] - $si[1], 0, 0, $si[0], $si[1]);
            break;
        case 4:
            imagecopy($im1, $im2, 0, $bi[1] - $si[1], 0, 0, $si[0], $si[1]);
            break;
        case 5:
            imagecopy($im1, $im2, ($bi[0] - $si[0]) / 2, ($bi[1] - $si[1]) / 2, 0, 0, $si[0], $si[1]);
            break;
    }
//根据后缀名生成不同格式的图片文件 
    switch ($bi[2]) {
        case 1:
            imagegif($im1);
            break;
        case 2;
            imagejpeg($im1);
            break;
        case 3;
            imagepng($im1);
            break;
    }
    imagedestroy($im1);
}


/**
 * @param string $srcimg 图片源地址
 * @param int $multiple 图片缩放倍数
 */
function thumbnail($srcimg, $multiple = 2) {
    $srcimg_arr = getimagesize($srcimg);
//计算缩略倍数 
    $thumb_width = $srcimg_arr[0] / $multiple;
    $thumb_height = $srcimg_arr[1] / $multiple;
    //常见图片索引对于的类型:1 = GIF,2 = JPG,3 = PNG
    switch ($srcimg_arr[2]) {
        case 1:
            $im = imagecreatefromgif($srcimg);
            break;
        case 2;
            $im = imagecreatefromjpeg($srcimg);
            break;
        case 3;
            $im = imagecreatefrompng($srcimg);
            break;
    }
    //开始缩略操作 
    $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
    //imagecopyresized() 将一幅图像中的一块正方形区域拷贝到另一个图像中,如果你还想设置透明度,那就用imagecopymerge
    imagecopyresized($thumb, $im, 0, 0, 0, 0, $thumb_width, $thumb_height, $srcimg_arr[0], $srcimg_arr[1]);
    switch ($srcimg_arr[2]) {
        case 1:
            imagegif($thumb);
            break;
        case 2;
            imagejpeg($thumb);
            break;
        case 3;
            imagepng($thumb);
            break;
    }
    imagedestroy($thumb);
}
thumbnail('qq.jpg',2);
watermark('git.png','qq.jpg', 3);
?>


一个简单的图像处理类,实现生成缩略图,裁剪,打水印功能。
<?php
// 原始图片
$img1 = 'git.png';
// 水印后的图片
$img2 = './image/git_new.jpg';
// 水印
$water = 'qq.jpg';
$img = new image();
// 等比缩放
$img->param($img1)->thumb('./image/test_0.jpg', 200,200,0);
// center center 裁剪
$img->param($img1)->thumb('./image/test_1.jpg', 200,200,1);
// top left 裁剪
$img->param($img1)->thumb('./image/test_2.jpg', 200,200,2);
// 右下角添加水印
$img->param($img1)->water($img2,$water,9);

class image {
        // 当前图片
        protected $img;
        // 图像types 对应表
        protected $types = array(
                        1 => 'gif',
                        2 => 'jpg',
                        3 => 'png',
                        6 => 'bmp'
                    );

        // image
        public function __construct($img=''){
                !$img && $this->param($img);
        }

        // Info
        public function param($img){
                $this->img = $img;
                return $this;
        }

        // imageInfo
        public function getImageInfo($img){
                $info = @getimagesize($img);
                if(isset($this->types[$info[2]])){
                        $info['ext'] = $info['type'] = $this->types[$info[2]];
                } else{
                        $info['ext'] = $info['type'] = 'jpg';
                }
                $info['type'] == 'jpg' && $info['type'] = 'jpeg';
                $info['size'] = @filesize($img);
                return $info;
        }

        // thumb(新图地址, 宽, 高, 裁剪, 允许放大)
        public function thumb($filename,$new_w=160,$new_h=120,$cut=0,$big=0){
        // 获取原图信息
        $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_h && $old_h < $new_w && !$big){
                    return false;
            }
            // 裁剪图片
            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;
                }
            // 载入原图
            $createFun  = 'ImageCreateFrom'.$type;
            $oldimg     = $createFun($this->img);
            // 创建缩略图
            if($type!='gif' && 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;
    }

    // water(保存地址,水印图片,水印位置,透明度)
        public function water($filename,$water,$pos=0,$pct=80){
                // 加载水印图片
                $info = $this->getImageInfo($water);
                if(!empty($info[0])){
                        $water_w = $info[0];
                        $water_h = $info[1];
                        $type = $info['type'];
                        $fun  = 'imagecreatefrom'.$type;
                        $waterimg = $fun($water);
                } else{
                        return false;
                }
                // 加载背景图片
                $info = $this->getImageInfo($this->img);
                if(!empty($info[0])){
                        $old_w = $info[0];
                        $old_h = $info[1];
                        $type  = $info['type'];
                        $fun   = 'imagecreatefrom'.$type;
                        $oldimg = $fun($this->img);
                } else{
                        return false;
                }
                // 剪切水印
                $water_w >$old_w && $water_w = $old_w;
                $water_h >$old_h && $water_h = $old_h;

                // 水印位置
                switch($pos){
                        case 0://随机
                    $posX = rand(0,($old_w - $water_w));
                    $posY = rand(0,($old_h - $water_h));
                    break;
                case 1://1为顶端居左
                    $posX = 0;
                    $posY = 0;
                    break;
                case 2://2为顶端居中
                    $posX = ($old_w - $water_w) / 2;
                    $posY = 0;
                    break;
                case 3://3为顶端居右
                    $posX = $old_w - $water_w;
                    $posY = 0;
                    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;
                }
                // 设定图像的混色模式
                imagealphablending($oldimg, true);
                // 添加水印
                imagecopymerge($oldimg, $waterimg, $posX, $posY, 0, 0, $water_w,$water_h,$pct);
                $fun = 'image'.$type;
                !@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并且可写?');
                  imagedestroy($oldimg);
                  imagedestroy($waterimg);
                  return $filename;
        }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐