php实现图片压缩处理


Posted in PHP onSeptember 09, 2020

本文实例为大家分享了php实现图片压缩处理的具体代码,供大家参考,具体内容如下

说明

在项目中,经常会遇到在前端页面展示用户自己上传的图片。当部分图片尺寸过大,页面图片过多的情况下(如论坛里需要显示用户头像),会引起页面加载缓慢的问题。由于用户图片已存储导数据库,无法改变库里的图片大小,只能在获取图片路径时,压缩图片

示例

以下函数为图片压缩方法

/**
 * 图片压缩处理
 * @param string $sFile 图片路径
 * @param int $iWidth 自定义图片宽度
 * @param int $iHeight 自定义图片高度
 */
function getThumb($sFile,$iWidth,$iHeight){
  //判断该图片是否存在
  if(!file_exists(public_path().$sFile)) return $sFile;
  //判断图片格式
  $attach_fileext = get_filetype($sFile);
  if (!in_array($attach_fileext, array('jpg','png','jpeg'))){
    return $sFile;
  }
  //压缩图片
  $sFileNameS = str_replace(".".$attach_fileext, "_".$iWidth.'_'.$iHeight.'.'.$attach_fileext, $sFile);
  //判断是否已压缩图片,若是则返回压缩图片路径
  if(file_exists(public_path().$sFileNameS)){
    return $sFileNameS;
  }
  //解决手机端上传图片被旋转问题
  if (in_array($attach_fileext, array('jpeg')) ){
    adjustPicOrientation(public_path().$sFile);
  }
  //生成压缩图片,并存储到原图同路径下
  resizeImage(public_path().$sFile, public_path().$sFileNameS, $iWidth, $iHeight);
  if(!file_exists(public_path().$sFileNameS)){
    return $sFile;
  }
  return $sFileNameS;
}

/**
 *获取文件后缀名
 */
function get_filetype($filename) {
  $extend = explode("." , $filename);
  return strtolower($extend[count($extend) - 1]);
}

/**
 * 解决手机上传图片被旋转问题
 * @param string $full_filename 文件路径
 */
function adjustPicOrientation($full_filename){
  $exif = exif_read_data($full_filename);
  if($exif && isset($exif['Orientation'])) {
    $orientation = $exif['Orientation'];
    if($orientation != 1){
      $img = imagecreatefromjpeg($full_filename);

      $mirror = false;
      $deg  = 0;

      switch ($orientation) {
        case 2:
          $mirror = true;
          break;
        case 3:
          $deg = 180;
          break;
        case 4:
          $deg = 180;
          $mirror = true;
          break;
        case 5:
          $deg = 270;
          $mirror = true;
          break;
        case 6:
          $deg = 270;
          break;
        case 7:
          $deg = 90;
          $mirror = true;
          break;
        case 8:
          $deg = 90;
          break;
      }
      if ($deg) $img = imagerotate($img, $deg, 0);
      if ($mirror) $img = _mirrorImage($img);
      //$full_filename = str_replace('.jpg', "-O$orientation.jpg", $full_filename);新文件名
      imagejpeg($img, $full_filename, 95);
    }
  }
  return $full_filename;
}

resizeImage(public_path().$sFile, public_path().$sFileNameS, $iWidth, $iHeight);

/**
 * 生成图片
 * @param string $im 源图片路径
 * @param string $dest 目标图片路径
 * @param int $maxwidth 生成图片宽
 * @param int $maxheight 生成图片高
 */
function resizeImage($im, $dest, $maxwidth, $maxheight) {
  $img = getimagesize($im);
  switch ($img[2]) {
    case 1:
      $im = @imagecreatefromgif($im);
      break;
    case 2:
      $im = @imagecreatefromjpeg($im);
      break;
    case 3:
      $im = @imagecreatefrompng($im);
      break;
  }

  $pic_width = imagesx($im);
  $pic_height = imagesy($im);
  $resizewidth_tag = false;
  $resizeheight_tag = false;
  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);
    }

    imagejpeg($newim, $dest);
    imagedestroy($newim);
  } else {
    imagejpeg($im, $dest);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
php中get_headers函数的作用及用法的详细介绍
Apr 27 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
thinkphp实现图片上传功能
Jan 13 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
Jun 10 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
如何在PHP中读写文件
Sep 07 #PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 #PHP
PHP autoload使用方法及步骤详解
Sep 05 #PHP
PHP数组访问常用方法解析
Sep 05 #PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 #PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 #PHP
Laravel Reponse响应客户端示例详解
Sep 03 #PHP
You might like
php标签云的实现代码
2012/10/10 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
PHP中Array相关函数简介
2016/07/03 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python星号*与**用法分析
2018/02/02 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
中医专业职业生涯规划书范文
2014/01/04 职场文书
建筑工地标语
2014/06/18 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python