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 13 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
Apr 20 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
May 27 PHP
简单谈谈favicon
Jun 10 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 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
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php 函数中使用static的说明
2012/06/01 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
Python操作MySQL简单实现方法
2015/01/26 Python
Python 加密的实例详解
2017/10/09 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
解决yum对python依赖版本问题
2019/07/05 Python
python下载库的步骤方法
2019/10/12 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
网游商务专员求职信
2013/10/15 职场文书
后勤园长自我鉴定
2013/10/17 职场文书
海南地接欢迎词
2014/01/14 职场文书
护士的自我鉴定
2014/02/07 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js
Python中requests库的用法详解
2022/06/05 Python