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 相关文章推荐
学习discuz php 引入文件的方法DISCUZ_ROOT
Jun 21 PHP
php下拉选项的批量操作的实现代码
Oct 14 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
用PHP代码给图片加水印
Jul 01 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
PHP进程通信基础之信号
Feb 19 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
nginx下安装php7+php5
2016/07/31 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
js css样式操作代码(批量操作)
2009/10/09 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python中str.format()详解
2017/03/12 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
中国跨境电商:Tomtop
2017/03/16 全球购物
工作表扬信的范文
2014/01/10 职场文书
信息管理应届生求职信
2014/03/07 职场文书
庆六一活动总结
2014/08/29 职场文书
js实现自动锁屏功能
2021/06/02 Javascript