zoukankan      html  css  js  c++  java
  • php 裁剪图片类

    <?php
    /*
    *说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形
    * 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高
    * written by smallchicken
    * time 2008-12-18
    */
    // 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白
    function my_image_resize($src_file, $dst_file , $new_width , $new_height) {
    if($new_width <1 || $new_height <1) {
    echo "params width or height error !";
    exit();
    }
    if(!file_exists($src_file)) {
    echo $src_file . " is not exists !";
    exit();
    }
    // 图像类型
    $type=exif_imagetype($src_file);
    $support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
    if(!in_array($type, $support_type,true)) {
    echo "this type of image does not support! only support jpg , gif or png";
    exit();
    }
    //Load image
    switch($type) {
    case IMAGETYPE_JPEG :
    $src_img=imagecreatefromjpeg($src_file);
    break;
    case IMAGETYPE_PNG :
    $src_img=imagecreatefrompng($src_file);
    break;
    case IMAGETYPE_GIF :
    $src_img=imagecreatefromgif($src_file);
    break;
    default:
    echo "Load image error!";
    exit();
    }
    $w=imagesx($src_img);
    $h=imagesy($src_img);
    $ratio_w=1.0 * $new_width / $w;
    $ratio_h=1.0 * $new_height / $h;
    $ratio=1.0;
    // 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
    if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
    if($ratio_w < $ratio_h) {
    $ratio = $ratio_h ; // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大
    }else {
    $ratio = $ratio_w ;
    }
    // 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求
    $inter_w=(int)($new_width / $ratio);
    $inter_h=(int) ($new_height / $ratio);
    $inter_img=imagecreatetruecolor($inter_w , $inter_h);
    imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
    // 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
    // 定义一个新的图像
    $new_img=imagecreatetruecolor($new_width,$new_height);
    imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
    switch($type) {
    case IMAGETYPE_JPEG :
    imagejpeg($new_img, $dst_file,100); // 存储图像
    break;
    case IMAGETYPE_PNG :
    imagepng($new_img,$dst_file,100);
    break;
    case IMAGETYPE_GIF :
    imagegif($new_img,$dst_file,100);
    break;
    default:
    break;
    }
    } // end if 1
    // 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
    // =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
    else{
    $ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值
    // 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
    $inter_w=(int)($w * $ratio);
    $inter_h=(int) ($h * $ratio);
    $inter_img=imagecreatetruecolor($inter_w , $inter_h);
    //将原图缩放比例后裁剪
    imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
    // 定义一个新的图像
    $new_img=imagecreatetruecolor($new_width,$new_height);
    imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
    switch($type) {
    case IMAGETYPE_JPEG :
    imagejpeg($new_img, $dst_file,100); // 存储图像
    break;
    case IMAGETYPE_PNG :
    imagepng($new_img,$dst_file,100);
    break;
    case IMAGETYPE_GIF :
    imagegif($new_img,$dst_file,100);
    break;
    default:
    break;
    }
    }// if3
    }// end function
    ?>

    第二个方法:

    <?php
    /*
        图片处理类:缩略,裁剪,圆角,倾斜
    */
    class resizeimage
    {
       //图片类型
       var $type;
       //实际宽度
       var $width;
       //实际高度
       var $height;
       //改变后的宽度
       var $resize_width;
       //改变后的高度
       var $resize_height;
       //是否裁图
       var $cut;
       //源图象
       var $srcimg;
       //目标图象地址
       var $dstimg;
       //圆角源
       var $corner;
       var $im;
    
    function resizeimage($img, $corner, $wid, $hei,$c, $corner_radius, $angle)
       {
           $this->srcimg = $img;
           $this->corner = $corner;
           $this->resize_width = $wid;
           $this->resize_height = $hei;
           $this->cut = $c;
           $this->corner_radius = $corner_radius;
           $this->angle = $angle;
           //图片的类型
           $this->type = substr(strrchr($this->srcimg,"."),1);
           //初始化图象
           $this->initi_img();
           //目标图象地址
           $this -> dst_img();
           //--
           $this->width = imagesx($this->im);
           $this->height = imagesy($this->im);
           //生成图象
           $this->newimg();
           ImageDestroy ($this->im);
       }
       function newimg()
       {
           //改变后的图象的比例
           $resize_ratio = ($this->resize_width)/($this->resize_height);
           //实际图象的比例
           $ratio = ($this->width)/($this->height);
           if(($this->cut)=="1")
           //裁图
           {
               if($ratio>=$resize_ratio)
               //高度优先
               {
                   $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
                   imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width,$this->resize_height, (($this->height)*$resize_ratio), $this->height);
                   $tmp = $this->rounded_corner($newimg,$this->resize_width);
                   imagepng ($tmp,$this->dstimg);
               }
               if($ratio<$resize_ratio)
               //宽度优先
               {
                   $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
                   imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width)/$resize_ratio));
                   $tmp = $this->rounded_corner($newimg);
                   imagepng ($tmp,$this->dstimg);
               }
           }
           else
           //不裁图
           {
               if($ratio>=$resize_ratio)
               {
                   $newimg = imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);
                   imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width)/$ratio, $this->width, $this->height);
                   ImageJpeg ($newimg,$this->dstimg);
               }
               if($ratio<$resize_ratio)
               {
                   $newimg = imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);
                   imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio, $this->resize_height, $this->width, $this->height);
                   ImageJpeg ($newimg,$this->dstimg);
               }
           }
       }
       //初始化图象
       function initi_img()
       {
           if($this->type=="jpg")
           {
               $this->im = imagecreatefromjpeg($this->srcimg);
           }
           if($this->type=="gif")
           {
               $this->im = imagecreatefromgif($this->srcimg);
           }
           if($this->type=="png")
           {
               $this->im = imagecreatefrompng($this->srcimg);
           }
       }
    
       //处理圆角
       function rounded_corner($image,$size)
       {
            $this->angle = 0;
            $topleft = true;
            $bottomleft = true;
            $bottomright = true;
            $topright = true;
            $corner_source = imagecreatefrompng('rounded_corner.png');
            $corner_width = imagesx($corner_source);  
            $corner_height = imagesy($corner_source);  
            $corner_resized = ImageCreateTrueColor($this->corner_radius, $this->corner_radius);
            ImageCopyResampled($corner_resized, $corner_source, 0, 0, 0, 0, $this->corner_radius, $this->corner_radius, $corner_width, $corner_height);
            $corner_width = imagesx($corner_resized);  
            $corner_height = imagesy($corner_resized);  
            $white = ImageColorAllocate($image,255,255,255);
            $black = ImageColorAllocate($image,0,0,0);
    
            //顶部左圆角
            if ($topleft == true) {
                $dest_x = 0;  
                $dest_y = 0;  
                imagecolortransparent($corner_resized, $black); 
                imagecopymerge($image, $corner_resized, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);
            } 
    
            //下部左圆角
            if ($bottomleft == true) {
                $dest_x = 0;  
                $dest_y = $size - $corner_height; 
                $rotated = imagerotate($corner_resized, 90, 0);
                imagecolortransparent($rotated, $black); 
                imagecopymerge($image, $rotated, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);  
            }
    
            //下部右圆角
            if ($bottomright == true) {
                $dest_x = $size - $corner_width;  
                $dest_y = $size - $corner_height;  
                $rotated = imagerotate($corner_resized, 180, 0);
                imagecolortransparent($rotated, $black); 
                imagecopymerge($image, $rotated, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);  
            }
    
            //顶部右圆角
            if ($topright == true) {
                $dest_x = $size - $corner_width;  
                $dest_y = 0;
                $rotated = imagerotate($corner_resized, 270, 0);
                imagecolortransparent($rotated, $black); 
                imagecopymerge($image, $rotated, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);  
            }
            $image = imagerotate($image, $this->angle, $white);
            return $image; 
       }
    
       //图象目标地址
       function dst_img()
       {
           $full_length = strlen($this->srcimg);
           $type_length = strlen($this->type);
           $name_length = $full_length-$type_length;
           $name         = substr($this->srcimg,0,$name_length-1);
           $this->dstimg = $name."_small.png";
       }
    }
    
    //resizeimage("图片地址", "处理后的宽度", "处理后的高度", "是否裁剪", "圆角度数", "倾斜度");
    $img_file = 'Sunset.jpg';
    $corner = 'rounded_corner.png';
    $resizeimage = new resizeimage($img_file, $corner, "80", "80", "1", "6", "0");
    ?>
    <img src="Sunset_small.png" border="0">
  • 相关阅读:
    51nod 237 最大公约数之和 V3 杜教筛
    luogu P4213 【模板】杜教筛(Sum)
    BZOJ 3527: [Zjoi2014]力 FFT
    凸多边形 HRBUST
    luogu P1354 房间最短路问题 计算几何_Floyd_线段交
    几何基础
    BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 Hash + Splay
    BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组
    BZOJ 2820: YY的GCD 莫比乌斯反演 + 数学推导 + 线性筛
    迭代器,三元表达式,列表生成式,字典生成式,生成器,递归(没深入理解)
  • 原文地址:https://www.cnblogs.com/newsouls/p/3193828.html
Copyright © 2011-2022 走看看