zoukankan      html  css  js  c++  java
  • php裁剪和缩放

      1 <?php
      2 
      3 /**
      4  *  @remark:将历史图片切成750x500尺寸
      5  *
      6  */
      7 class Cutimage{
      8     private $file_name;
      9     private $file_path;
     10     private $pwidth;
     11     private $pheight;
     12     public function __construct($file_name,$file_path,$width,$height){
     13         $this->file_name=$file_name;
     14         $this->file_path=$file_path;
     15         $this->pwidth=$width;
     16         $this->pheight=$height;
     17     }
     18     public function index(){
     19         $name=$this->file_name;
     20         $file_path=$this->file_path;
     21         $local_img=$file_path.$name;
     22         $new_img= self::zoom($local_img,$this->pwidth,$this->pheight);///切成750x500的
     23         if($new_img!=null){
     24             $sf_path=$file_path.$new_img;
     25             self::zoomimg($sf_path,$sf_path,$this->pwidth,$this->pheight);    //缩放图片
     26         }
     27     }
     28     /**
     29      * 裁剪函数:原图/目标图 这种比例 以小的比例为准
     30      */
     31     public function zoom($back,$target_width,$target_height){
     32         try{
     33             $info = getimagesize($back);
     34         }catch(Exception $e){
     35             return null;
     36         }
     37         if(!$info) return null;
     38         $str =$info['mime'];
     39         $arr =explode('/',$str);
     40         $ext = $arr[1];
     41         $create = 'imagecreatefrom'.$ext;
     42         $save = 'image'.$ext;
     43         ini_set("memory_limit", "600M");
     44         $img = $create($back);
     45         $source_width=$info[0];
     46         $source_height=$info[1];
     47         $width_ratio=$info[0]/$target_width;
     48         $height_ratio=$info[1]/$target_height;
     49         if($width_ratio<$height_ratio){
     50             if($info[0]<=$target_width){
     51                 $cropped_width=$info[0];
     52                 $source_x=0;
     53                 $cropped_height=$target_height*$width_ratio;
     54                 if($cropped_height<$info[1]){$source_y=($info[1]-$cropped_height)/2;}
     55                 else{$source_y=0;}
     56             }else{
     57                 // $cropped_width=$target_width; 如果按原图宽>目标宽  不裁剪宽
     58                 $cropped_width=$info[0];
     59                 // $source_x = ($source_width - $cropped_width) / 2;
     60                 $source_x=0;
     61                 $cropped_height=$target_height*$width_ratio;
     62                 if($cropped_height<$info[1]){$source_y=($info[1]-$cropped_height)/2;}
     63                 else{$source_y=0;}
     64             }
     65 
     66         }elseif($width_ratio>$height_ratio){
     67             if($info[1]<$target_height){
     68                 $cropped_height=$info[1];
     69                 $source_y=0;
     70                 $cropped_width=$height_ratio*$target_width;
     71                 if($cropped_width<$info[0]){$source_x = ($source_width - $cropped_width) / 2;}
     72                 else{$source_x=0;}
     73             }else{
     74                 $cropped_height=$info[1];
     75                 // $source_y = ($source_height - $cropped_height) / 2;
     76                 $source_y =0;
     77                 $cropped_width=$height_ratio*$target_width;
     78                 if($cropped_width<$info[0]){$source_x = ($source_width - $cropped_width) / 2;}
     79                 else{$source_x=0;}
     80             }
     81         }
     82         else{    // 源图适中
     83             $cropped_width  = $source_width;
     84             $cropped_height = $source_height;
     85             $source_x = 0;
     86             $source_y = 0;
     87         }
     88         $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);
     89         imagecopy($cropped_image, $img, 0, 0, $source_x, $source_y, $cropped_width,$cropped_height);
     90         $name = basename($back);
     91         $pre=$target_width.'x'.$target_height.'_';
     92         $filename=$pre.$name;
     93         $save($cropped_image,'./'.$filename);
     94         imagedestroy($img);
     95         imagedestroy($cropped_image);
     96         return $filename;
     97     }
     98     /*
     99       @param $inf 待缩放图片路径
    100       @param $outf  缩放后图片存放路径
    101       @param $ow 目标缩放宽度
    102       @param $oh 目标缩放高度
    103       @param $force 若原图长宽都比目标图片小,是否强制放大,0为输出原图,1为强制放大
    104     */
    105     public function zoomimg($inf, $outf, $ow, $oh, $q=80, $force=0){
    106         if(file_exists($inf)){
    107             $ow = intval($ow);
    108             $oh = intval($oh);
    109             $q = intval($q);
    110             //取得源图片的宽度和高度
    111             $size_src=getimagesize($inf);
    112             $iw=$size_src['0'];
    113             $ih=$size_src['1'];
    114             $str =$size_src['mime'];
    115             $arr =explode('/',$str);
    116             $ext = $arr[1];
    117             $create = 'imagecreatefrom'.$ext;
    118             $save = 'image'.$ext;
    119             if($ext == 'png'){
    120                 $q = 9;
    121             }else{
    122                 $q = 80;
    123             }
    124             //图片的等比缩放
    125             $src=$create($inf);
    126             //根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度
    127             if(($ow > $iw && $oh > $ih) || ($ow == 0 && $oh == 0) || ($ow == 0 && $oh >$ih) || ($ow > $iw && $oh == 0)){
    128                 $ow = $iw;
    129                 $oh = $ih;
    130             }elseif($ow == 0){
    131                 $ow = $iw*($oh/$ih);
    132             }elseif($oh == 0){
    133                 $oh = $ih*($ow/$iw);
    134             }elseif($iw/$ow > $ih/$oh){
    135                 $oh = $ih*($ow/$iw);
    136             }else{
    137                 $ow = $iw*($oh/$ih);
    138             }
    139             //声明一个$w宽,$h高的真彩图片资源
    140             $image=imagecreatetruecolor($ow, $oh);
    141             //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
    142             imagecopyresampled($image, $src, 0, 0, 0, 0, $ow, $oh, $iw, $ih);
    143             $save($image,$outf,$q);
    144             //销毁资源
    145             imagedestroy($image);
    146             return true;
    147         }else{
    148             return false;
    149         }
    150     }
    151 }
  • 相关阅读:
    在Windows平台上安装Node.js及NPM模块管理
    MySQL远程访问授权
    JSON (仅限本地)
    Json 调用 天气API 实例
    JS调用腾讯接口获取天气
    jsonp 调用天气API
    兼容性
    MySql like模糊查询使用详解
    编绎报错,解决方法objc_msgSend too many arguments to function call,expected 0, have3 (转)
    OC中ARC forbids explicit message send of release错误(转)
  • 原文地址:https://www.cnblogs.com/wumoran/p/6912821.html
Copyright © 2011-2022 走看看