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知道与问问的采集插件代码
Oct 12 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
PDO的安全处理与事物处理方法
Oct 31 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 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
模仿OSO的论坛(四)
2006/10/09 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
React Router基础使用
2017/01/17 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
python2 与python3的print区别小结
2018/01/16 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
python实现梯度下降法
2020/03/24 Python
如何验证python安装成功
2020/07/06 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
秋季运动会广播稿大全
2014/02/17 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android