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操作数组相关函数
Feb 03 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
如何用C语言编写PHP扩展的详解
Jun 13 PHP
php通过字符串调用函数示例
Mar 02 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 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中取得image按钮传递的name值
2006/10/09 PHP
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
js图片自动切换效果处理代码
2013/05/07 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
Python理解递归的方法总结
2019/01/28 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
python中threading开启关闭线程操作
2020/05/02 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
军训自我鉴定怎么写
2014/02/13 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
上诉状格式
2015/05/23 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书