-
php实现图片压缩处理
这篇文章主要为大家详细介绍了php实现图片压缩处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
本文实例为大家分享了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);
- }
- }
原文链接:http://www.phpfensi.com/php/20220326/20270.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式