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 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
谈谈新手如何学习PHP
Dec 14 PHP
php一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
PHP常用代码大全(新手入门必备)
Jun 29 PHP
php 获取本地IP代码
Jun 23 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
PHP多进程编程实例
Oct 15 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP实现负载均衡下的session共用功能
Apr 17 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学习之数据类型之间的转换介绍
2011/06/09 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
33道php常见面试题及答案
2015/07/06 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
本科生职业生涯规划书范文
2014/01/21 职场文书
咖啡店创业计划书
2014/08/15 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
试用期自我评价范文
2015/03/10 职场文书
工程进度款催款函
2015/06/24 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
分析Java中Map的遍历性能问题
2021/06/26 Java/Android