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(3)
Oct 09 PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
PHP教程 预定义变量
Oct 23 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
php实现的CSS更新类实例
Sep 22 PHP
分享一则PHP定义函数代码
Feb 26 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
详解PHP字符串替换str_replace()函数四种用法
Oct 13 PHP
PHP PDOStatement::bindColumn讲解
Jan 30 PHP
PHP 代码简洁之道(小结)
Oct 16 PHP
php中try catch捕获异常实例详解
Aug 06 PHP
PHP sdk实现在线打包代码示例
Dec 09 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的错误信息
2006/10/09 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python hmac模块使用实例解析
2019/12/24 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
为什么需要版本控制
2016/10/28 面试题
网站编辑求职信
2013/10/17 职场文书
优秀村官事迹材料
2014/01/10 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
房产协议书范本
2014/10/18 职场文书
初中家长意见
2015/06/03 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
Java中try catch处理异常示例
2021/12/06 Java/Android