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 删除cookie和浏览器重定向
Mar 16 PHP
php 引用(&amp;)详解
Nov 20 PHP
php Smarty date_format [格式化时间日期]
Mar 15 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
php array_keys 返回数组的键名
Oct 25 PHP
php数组指针操作详解
Feb 14 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 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计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
Prototype String对象 学习
2009/07/19 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
Python常用特殊方法实例总结
2019/03/22 Python
Python numpy数组转置与轴变换
2019/11/15 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
客户表扬信范文
2014/01/10 职场文书
活动总结怎么写啊
2014/05/07 职场文书
女儿满月酒致辞
2015/07/29 职场文书
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
Python Matplotlib绘制动画的代码详解
2022/05/30 Python
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis