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 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
一个PHP的QRcode类与大家分享
Nov 13 PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
PHP基本语法总结
Sep 06 PHP
PHP 快速排序算法详解
Nov 10 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 PHP
PHP生成图表pChart的示例解析
Jul 31 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/04/28 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
分享PHP守护进程类
2015/12/30 PHP
php中strtotime函数性能分析
2016/11/20 PHP
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
Python写的Socks5协议代理服务器
2014/08/06 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Python实现多属性排序的方法
2018/12/05 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
python怎么判断模块安装完成
2020/06/19 Python
python中sys模块是做什么用的
2020/08/16 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
python实现磁盘日志清理的示例
2020/11/05 Python
python中二分查找法的实现方法
2020/12/06 Python
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
神龙架导游词
2015/02/11 职场文书
红与黑读书笔记
2015/06/29 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
Redis入门教程详解
2021/08/30 Redis
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS