PHP自定义图片缩放函数实现等比例不失真缩放的方法


Posted in PHP onAugust 19, 2016

本文实例讲述了PHP自定义图片缩放函数实现等比例不失真缩放的方法。分享给大家供大家参考,具体如下:

function resizeImage($im,$maxwidth,$maxheight,$name,$filetype)
{
  $pic_width = imagesx($im);
  $pic_height = imagesy($im);

  if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))
  {
    if($maxwidth && $pic_width>$maxwidth)
    {
      $widthratio = $maxwidth/$pic_width;
      $resizewidth_tag = true;
    }

    if($maxheight && $pic_height>$maxheight)
    {
      $heightratio = $maxheight/$pic_height;
      $resizeheight_tag = true;
    }

    if($resizewidth_tag && $resizeheight_tag)
    {
      if($widthratio<$heightratio)
        $ratio = $widthratio;
      else
        $ratio = $heightratio;
    }

    if($resizewidth_tag && !$resizeheight_tag)
      $ratio = $widthratio;
    if($resizeheight_tag && !$resizewidth_tag)
      $ratio = $heightratio;

    $newwidth = $pic_width * $ratio;
    $newheight = $pic_height * $ratio;

    if(function_exists("imagecopyresampled"))
    {
      $newim = imagecreatetruecolor($newwidth,$newheight);
      imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
    }
    else
    {
      $newim = imagecreate($newwidth,$newheight);
      imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
    }

    $name = $name.$filetype;
    imagejpeg($newim,$name);
    imagedestroy($newim);
  }
  else
  {
    $name = $name.$filetype;
    imagejpeg($im,$name);
  }
}

参数说明:

$im 图片对象,应用函数之前,你需要用imagecreatefromjpeg()读取图片对象,如果PHP环境支持PNG,GIF,也可使用imagecreatefromgif(),imagecreatefrompng();

$maxwidth 定义生成图片的最大宽度(单位:像素)

$maxheight 生成图片的最大高度(单位:像素)

$name 生成的图片名

$filetype 最终生成的图片类型(.jpg/.png/.gif)

代码注释:

第3~4行:读取需要缩放的图片实际宽高

第8~26行:通过计算实际图片宽高与需要生成图片的宽高的压缩比例最终得出进行图片缩放是根据宽度还是高度进行缩放,当前程序是根据宽度进行图片缩放。如果你想根据高度进行图片缩放,你可以将第22行的语句改成$widthratio>$heightratio

第28~31行:如果实际图片的长度或者宽度小于规定生成图片的长度或者宽度,则要么根据长度进行图片缩放,要么根据宽度进行图片缩放。

第33~34行:计算最终缩放生成的图片长宽。

第36~45行:根据计算出的最终生成图片的长宽改变图片大小,有两种改变图片大小的方法:ImageCopyResized()函数在所有GD版本中有效,但其缩放图像的算法比较粗糙。ImageCopyResamples(),其像素插值算法得到的图像边缘比较平滑,但该函数的速度比ImageCopyResized()慢。

第47~49行:最终生成经过处理后的图片,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()

第51~56行:如果实际图片的长宽小于规定生成的图片长宽,则保持图片原样,同理,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()。

特别说明:

GD库1.6.2版以前支持GIF格式,但因GIF格式使用LZW演算法牵涉专利权,因此在GD1.6.2版之后不支持GIF的格式。如果你是WINDOWS的环境,你只要进入PHP.INI文件找到extension=php_gd2.dll,将#去除,重启APACHE即可,如果你是Linux环境,又想支持GIF,PNG,JPEG,你需要去下载libpng,zlib,以及freetype字体并安装。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP面向对象编程快速入门
Dec 14 PHP
php绝对路径与相对路径之间关系的的分析
Mar 03 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
php调用新浪短链接API的方法
Nov 08 PHP
PHP导出Excel实例讲解
Jan 24 PHP
php网页版聊天软件实现代码
Aug 12 PHP
php实现图片以base64显示的方法
Oct 13 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
php实现socket推送技术的示例
Dec 20 PHP
Yii框架核心组件类实例详解
Aug 06 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 #PHP
Thinkphp框架开发移动端接口(1)
Aug 18 #PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 #PHP
PHP文件下载实例代码浅析
Aug 17 #PHP
PHP Ajax实现无刷新附件上传
Aug 17 #PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 #PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 #PHP
You might like
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
Python实现查看系统启动项功能示例
2018/05/10 Python
Python中logging实例讲解
2019/01/17 Python
python3 pygame实现接小球游戏
2019/05/14 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
入党申请书自我鉴定
2013/10/12 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
毕业生个人求职信范例分享
2013/12/17 职场文书
《将心比心》教学反思
2014/04/08 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
员工辞退通知书
2015/04/17 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers