PHP全功能无变形图片裁剪操作类与用法示例


Posted in PHP onJanuary 10, 2017

本文实例讲述了PHP全功能无变形图片裁剪操作类与用法。分享给大家供大家参考,具体如下:

如果需要图片裁剪,或生成缩略图,这个基本上没有问题,全部需要的功能都在里面,全部都是无变形的。

这里我们划分为四种模式:

1. 任意图片裁剪到指定大小,超过的,剧中裁剪,并且最大化缩放,不够的拉伸,
2. 超过的剧中裁剪,而不足的,不拉伸,即只缩小,不放大裁剪,会产生补白,可以用png透明度来消除
3. 保留全部图片信息。不裁剪,只缩放,不足的补白。
4. 保留全部图片信息。不裁剪,只缩放,不足的不补白,产生的图片为实际有效像素大小,例如有个图片是600X600 现在要生成 120X100 那么缩放后的实际有效像素为100X100,所以只生成100X100的图片,而第三种模式则生成120X100的大小,并且有补白

代码如下(此处代码通过本站在线工具http://tools.3water.com/code/3water_php_format做了格式化处理):

<?php
/**
* Author : smallchicken
* mode 1 : 强制裁剪,生成图片严格按照需要,不足放大,超过裁剪,图片始终铺满
* mode 2 : 和1类似,但不足的时候 不放大 会产生补白,可以用png消除。
* mode 3 : 只缩放,不裁剪,保留全部图片信息,会产生补白,
* mode 4 : 只缩放,不裁剪,保留全部图片信息,生成图片大小为最终缩放后的图片有效信息的实际大小,不产生补白
* 默认补白为白色,如果要使补白成透明像素,请使用SaveAlpha()方法代替SaveImage()方法
*
* 调用方法:
*
* $ic=new ImageCrop('old.jpg','afterCrop.jpg');
* $ic->Crop(120,80,2);
* $ic->SaveImage();
*    //$ic->SaveAlpha();将补白变成透明像素保存
* $ic->destory();
*
*
*/
class ImageCrop {
  var $sImage;
  var $dImage;
  var $src_file;
  var $dst_file;
  var $src_width;
  var $src_height;
  var $src_ext;
  var $src_type;
  function ImageCrop($src_file,$dst_file='') {
    $this->src_file=$src_file;
    $this->dst_file=$dst_file;
    $this->LoadImage();
  }
  function SetSrcFile($src_file) {
    $this->src_file=$src_file;
  }
  function SetDstFile($dst_file) {
    $this->dst_file=$dst_file;
  }
  function LoadImage() {
    list($this->src_width, $this->src_height, $this->src_type) = getimagesize($this->src_file);
    switch($this->src_type) {
      case IMAGETYPE_JPEG :
      $this->sImage=imagecreatefromjpeg($this->src_file);
      $this->ext='jpg';
      break;
      case IMAGETYPE_PNG :
      $this->sImage=imagecreatefrompng($this->src_file);
      $this->ext='png';
      break;
      case IMAGETYPE_GIF :
      $this->sImage=imagecreatefromgif($this->src_file);
      $this->ext='gif';
      break;
      default:
      exit();
    }
  }
  function SaveImage($fileName='') {
    $this->dst_file=$fileName ? $fileName : $this->dst_file;
    switch($this->src_type) {
      case IMAGETYPE_JPEG :
      imagejpeg($this->dImage,$this->dst_file,100);
      break;
      case IMAGETYPE_PNG :
      imagepng($this->dImage,$this->dst_file);
      break;
      case IMAGETYPE_GIF :
      imagegif($this->dImage,$this->dst_file);
      break;
      default:
      break;
    }
  }
  function OutImage() {
    switch($this->src_type) {
      case IMAGETYPE_JPEG :
      header('Content-type: image/jpeg');
      imagejpeg($this->dImage);
      break;
      case IMAGETYPE_PNG :
      header('Content-type: image/png');
      imagepng($this->dImage);
      break;
      case IMAGETYPE_GIF :
      header('Content-type: image/gif');
      imagegif($this->dImage);
      break;
      default:
      break;
    }
  }
  function SaveAlpha($fileName='') {
    $this->dst_file=$fileName ? $fileName . '.png' : $this->dst_file .'.png';
    imagesavealpha($this->dImage, true);
    imagepng($this->dImage,$this->dst_file);
  }
  function OutAlpha() {
    imagesavealpha($this->dImage, true);
    header('Content-type: image/png');
    imagepng($this->dImage);
  }
  function destory() {
    imagedestroy($this->sImage);
    imagedestroy($this->dImage);
  }
  function Crop($dst_width,$dst_height,$mode=1,$dst_file='') {
    if($dst_file) $this->dst_file=$dst_file;
    $this->dImage = imagecreatetruecolor($dst_width,$dst_height);
    $bg = imagecolorallocatealpha($this->dImage,255,255,255,127);
    imagefill($this->dImage, 0, 0, $bg);
    imagecolortransparent($this->dImage,$bg);
    $ratio_w=1.0 * $dst_width / $this->src_width;
    $ratio_h=1.0 * $dst_height / $this->src_height;
    $ratio=1.0;
    switch($mode) {
      case 1:    // always crop
      if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
        $ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
        $tmp_w = (int)($dst_width / $ratio);
        $tmp_h = (int)($dst_height / $ratio);
        $tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
        $src_x = (int) (($this->src_width-$tmp_w)/2) ;
        $src_y = (int) (($this->src_height-$tmp_h)/2) ;
        imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
        imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
        imagedestroy($tmp_img);
      } else {
        $ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
        $tmp_w = (int)($this->src_width * $ratio);
        $tmp_h = (int)($this->src_height * $ratio);
        $tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
        imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
        $src_x = (int)($tmp_w - $dst_width) / 2 ;
        $src_y = (int)($tmp_h - $dst_height) / 2 ;
        imagecopy($this->dImage, $tmp_img, 0,0,$src_x,$src_y,$dst_width,$dst_height);
        imagedestroy($tmp_img);
      }
      break;
      case 2:    // only small
      if($ratio_w < 1 && $ratio_h < 1) {
        $ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
        $tmp_w = (int)($dst_width / $ratio);
        $tmp_h = (int)($dst_height / $ratio);
        $tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
        $src_x = (int) ($this->src_width-$tmp_w)/2 ;
        $src_y = (int) ($this->src_height-$tmp_h)/2 ;
        imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
        imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
        imagedestroy($tmp_img);
      } elseif($ratio_w > 1 && $ratio_h > 1) {
        $dst_x = (int) abs($dst_width - $this->src_width) / 2 ;
        $dst_y = (int) abs($dst_height -$this->src_height) / 2;
        imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
      } else {
        $src_x=0;
        $dst_x=0;
        $src_y=0;
        $dst_y=0;
        if(($dst_width - $this->src_width) < 0) {
          $src_x = (int) ($this->src_width - $dst_width)/2;
          $dst_x =0;
        } else {
          $src_x =0;
          $dst_x = (int) ($dst_width - $this->src_width)/2;
        }
        if( ($dst_height -$this->src_height) < 0) {
          $src_y = (int) ($this->src_height - $dst_height)/2;
          $dst_y = 0;
        } else {
          $src_y = 0;
          $dst_y = (int) ($dst_height - $this->src_height)/2;
        }
        imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,$src_x,$src_y,$this->src_width,$this->src_height);
      }
      break;
      case 3:    // keep all image size and create need size
      if($ratio_w > 1 && $ratio_h > 1) {
        $dst_x = (int)(abs($dst_width - $this->src_width )/2) ;
        $dst_y = (int)(abs($dst_height- $this->src_height)/2) ;
        imagecopy($this->dImage, $this->sImage, $dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
      } else {
        $ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
        $tmp_w = (int)($this->src_width * $ratio);
        $tmp_h = (int)($this->src_height * $ratio);
        $tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
        imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
        $dst_x = (int)(abs($tmp_w -$dst_width )/2) ;
        $dst_y = (int)(abs($tmp_h -$dst_height)/2) ;
        imagecopy($this->dImage, $tmp_img, $dst_x,$dst_y,0,0,$tmp_w,$tmp_h);
        imagedestroy($tmp_img);
      }
      break;
      case 4:    // keep all image but create actually size
      if($ratio_w > 1 && $ratio_h > 1) {
        $this->dImage = imagecreatetruecolor($this->src_width,$this->src_height);
        imagecopy($this->dImage, $this->sImage,0,0,0,0,$this->src_width,$this->src_height);
      } else {
        $ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
        $tmp_w = (int)($this->src_width * $ratio);
        $tmp_h = (int)($this->src_height * $ratio);
        $this->dImage = imagecreatetruecolor($tmp_w ,$tmp_h);
        imagecopyresampled($this->dImage,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
      }
      break;
    }
  }
  // end Crop
}
?>
PHP 相关文章推荐
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
Jun 30 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
php算法实例分享
Jul 14 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
详解php用static方法的原因
Sep 12 PHP
php实现36进制与10进制转换功能示例
Jan 10 #PHP
php获取当前url地址的方法小结
Jan 10 #PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 #PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 #PHP
php 访问oracle 存储过程实例详解
Jan 08 #PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 #PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 #PHP
You might like
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python学习小技巧之列表项的拼接
2017/05/20 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
儿童python练习实例
2018/05/27 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
python3 深浅copy对比详解
2019/08/12 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
python 命令行传入参数实现解析
2019/08/30 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
python 实现图片裁剪小工具
2021/02/02 Python
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
九年级语文教学反思
2014/02/04 职场文书
师德师风整改措施
2014/10/24 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
武夷山导游词
2015/02/03 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
法律讲堂观后感
2015/06/11 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python