PHP图片裁剪与缩放示例(无损裁剪图片)


Posted in PHP onFebruary 08, 2017

本文介绍了PHP图片裁剪与缩放示例,废话不多少,具体代码如下:

/*

 *exif_imagetype -- 判断一个图像的类型

 *功能说明:函数功能是把一个图像裁剪为任意大小的图像,并保持图像不变形

 *参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高

 */

 

// 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白

function image_resize($src_file, $dst_file, $new_width, $new_height)

{

  $new_width = intval($new_width);

   

  $new_height = intval($new_width);

   

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

     

    //var_dump($inter_img);

     

    imagecopy($inter_img, $src_img, 0, 0, 0, 0, $inter_w, $inter_h);

     

    // 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像

    // 定义一个新的图像

     

    $new_img = imagecreatetruecolor($new_width, $new_height);

     

    //var_dump($new_img);exit();

    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

//输出新图片

image_resize('test.jpg', 'demo.jpg', '1200px', '1200px');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
PHP中最容易忘记的一些知识点总结
Apr 28 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
Feb 18 PHP
php中require和require_once的区别说明
Feb 27 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
php实现XML和数组的相互转化功能示例
Feb 08 #PHP
PHP 获取指定地区的天气实例代码
Feb 08 #PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 #PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 #PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 #PHP
PHP输出XML格式数据的方法总结
Feb 08 #PHP
PHP中大括号'{}'用法实例总结
Feb 08 #PHP
You might like
PHP中的integer类型使用分析
2010/07/27 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
PHP7新功能总结
2019/04/14 PHP
类之Prototype.js学习
2007/06/13 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
Python 多进程和数据传递的理解
2017/10/09 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
Python的多维空数组赋值方法
2018/04/13 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
购买一个高级域名:BuyDomains
2018/03/11 全球购物
旅游管理毕业生自荐信范文
2014/03/19 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
大学生团日活动总结
2015/05/06 职场文书
2016大学军训心得体会
2016/01/11 职场文书