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 相关文章推荐
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
用session做客户验证时的注意事项
Oct 09 PHP
PHP cron中的批处理
Sep 16 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
PHP连续签到功能实现方法详解
Dec 04 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 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读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
pyside写ui界面入门示例
2014/01/22 Python
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
python实现网站的模拟登录
2016/01/04 Python
Python高级用法总结
2018/05/26 Python
Django中的静态文件管理过程解析
2019/08/01 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
自主招生自荐信指南
2014/02/04 职场文书
合伙经营协议书
2014/04/18 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
个人先进事迹材料
2014/12/29 职场文书
家长会欢迎词
2015/01/23 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL