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开发入门教程之面向对象
Dec 05 PHP
常用的php对象类型判断
Aug 27 PHP
php fckeditor 调用的函数
Jun 21 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP四种基本排序算法示例
Apr 09 PHP
PHP数学运算函数大汇总(经典值得收藏)
Apr 01 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
php让json_encode不自动转义斜杠“/”的方法
Apr 27 PHP
PHP正则表达式之RCEService回溯
Apr 11 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开发入门教程之面向对象
2006/12/05 PHP
php 购物车的例子
2009/05/04 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
javascript闭包的理解
2015/04/01 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
简单谈谈Python的pycurl模块
2018/04/07 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
详解python-图像处理(映射变换)
2019/03/22 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
python从PDF中提取数据的示例
2020/10/30 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
办公室主任岗位竞聘书
2015/09/15 职场文书