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 相关文章推荐
怎么使 Mysql 数据同步
Oct 09 PHP
php中计算时间差的几种方法
Dec 31 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
PHP字符串与数组处理函数用法小结
Jan 07 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
Content-type 的说明
2006/10/09 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python中下划线的使用方法
2015/03/27 Python
进一步了解Python中的XML 工具
2015/04/13 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python sorted方法和列表使用解析
2019/11/18 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
python 模拟登陆github的示例
2020/12/04 Python
python实现简单文件读写函数
2021/02/25 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
平面设计专业求职信
2014/08/09 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
语文复习计划
2015/01/19 职场文书
首席执行官观后感
2015/06/03 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js