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之第九天
Oct 09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
深入密码加salt原理的分析
Jun 06 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
初识PHP中的Swoole
Apr 05 PHP
php生成图片缩略图功能示例
Feb 22 PHP
Yii2语言国际化的配置教程
Aug 19 PHP
PHP设计模式之命令模式示例详解
Dec 20 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 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 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
Java面向对象面试题
2016/12/26 面试题
音乐教学随笔感言
2014/02/19 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
欢迎家长标语
2014/10/08 职场文书
环境建议书
2015/02/04 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
AJAX学习笔记
2021/05/18 Javascript