当前位置: 首页 > news >正文

生成图片_ThinkPHP5 动态生成图片缩略图

28afe9e79db7dfaf971757bbfaf4f3c4.png

php中文网最新课程

每日17点准时技术干货分享

bfaef7b93855d9d3822bfd94a0734dd5.png

805c0d9eaa86fc8ecbbcf1beba89c346.gif

需求场景

不同终端(PC端、手机端、平板),不同界面(列表页、详情页),对图片大小的要求不一样, 如果所有场景下都使用同一尺寸的图片,势必对会网络带宽及服务器性能造成一定的影响,由此需要服务器端能够根据前端的请求参数,自动匹配出相对应的图片资源,以此来降低服务端的压力,同时也能给用户带来更友好的用户体验。

具体步骤如下:

1、开启apache的rewrite功能,具体方法请自行百度。

2、修改.htaccess

  Options +FollowSymlinks -Multiviews  RewriteEngine On  RewriteCond %{REQUEST_FILENAME} !-d  RewriteCond %{REQUEST_FILENAME} !-f  RewriteRule ^public/upload/(.*)/(.*)/(.*)_(\d+)_(\d+).(png|jpg|jpeg|gif)$ /index.php/api/Attachment/thumbnail/module/$1/date/$2/original/$3/width/$4/height/$5/ext/$6 [L,R]  RewriteCond %{REQUEST_FILENAME} !-d  RewriteCond %{REQUEST_FILENAME} !-f  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

以上配置规则表示,如果存在对应的图片资源,则由apache直接返回,如果不存在,则转发给/index.php/api/Attachment/thumbnail处理器去处理。

其它参数说明:

$1:图片所属模块

$2:图片上传日期

$3:原始图片名称(不含后缀)

$4:目标图片宽度

$5:目标图片高度

$6:图片后缀

友情提示:根据图片存储规则的不同,此处的配置规则及参数可以作相应的调整。

3、新增缩略图处理程序,此处为Attachment 文件,内容如下:

public function thumbnail() {        $savePath = Config::get('attachment_path');        $defaultImage = $savePath.'default.jpg';        $params = Request::instance()->param();        $module = $params['module'];  // 图片所属模块        $date = $params['date'];      // 图片上传日期        $original = $params['original']; // 原始图片名称(不含后缀)        $width = $params['width'];    // 目标图片宽度        $height = $params['height'];  // 目标图片高度        $ext = $params['ext'];        // 图片后缀        $originName = sprintf('%s%s/%s/%s.%s',$savePath,$module,$date,$original,$ext);        $targetName = sprintf('%s%s/%s/%s_%s_%s.%s',$savePath,$module,$date,$original,$width,$height,$ext);        if (!file_exists($originName)) {            $originName = $defaultImage;            $targetName = sprintf('%sdefault_%s_%s.jpg',$savePath,$width,$height);        }        $image = Image::open($originName);        $thumb = $image->thumb($width, $height);        if (!file_exists($targetName)) {            $thumb->save($targetName);        }        $thumb->preview();    }

4、vendor/topthink/think-image/src/Image.php文件中新增一个方法,内容如下:

/**     * 预览图像     * @param int         $quality   图像质量     * @param bool        $interlace 是否对JPEG类型图像设置隔行扫描     * @return $this     */    public function preview($quality = 100, $interlace = true){        $type = $this->info['type'];        header('content-type:'.$this->info['mime']);        if ('jpeg' == $type || 'jpg' == $type) {            //JPEG图像设置隔行扫描            imageinterlace($this->im, $interlace);            imagejpeg($this->im, null, $quality);        } elseif ('gif' == $type && !empty($this->gif)) {            imagegif($this->im, null);        } elseif ('png' == $type) {            //设定保存完整的 alpha 通道信息            imagesavealpha($this->im, true);            //ImagePNG生成图像的质量范围从0到9的            imagepng($this->im, null, min((int) ($quality / 10), 9));        } else {            $fun = 'image' . $type;            $fun($this->im, '');        }       exit;    }

5、访问示例

在浏览器中输入:

http://域名/public/upload/news/20190325/442b8dba3f706cf6822c1255bcaa68de_320_240.jpg

将会看到一张宽320,高240的图片。

-END-

相关文章:

  • c++max函数怎么用_比函数还强大的Excel分列技巧,你知道怎么用吗
  • mysql2005错误_SQL Server 2005 还原数据库错误解决方法
  • mysql中取字符串函数是_MySQL 字符串函数:字符串截取
  • mysql查询时间提前五天_MySQL查询不含周末的五天前的日期
  • elasticsearch 嵌入式_3.JanusGraph+HBase+ElasticSearch配置
  • mysql数据库怎末导出函数_MySQL数据库之mysql 导入导出数据库以及函数、存储过程的介绍...
  • Mysql 数组放进表里_新人求大神教教:如何把一个一维数组存入mysql 表格中
  • rabbitmq支持两个消费者同时提取数据吗_认识RabbitMQ从这篇文章开始
  • 安装mysql什么版本号_Linux安装MySQL以及版本说明
  • mysql的checkpoint_mysql 之 checkpoint和LSN详解
  • asp.net 调mysql过程_asp.net c# java调用mysql存储过程方法
  • java和Mysql数据一致性_Redis缓存和MySQL数据一致性方案详解
  • mysql double 转string类型转换_String类型转化为double类型的问题
  • mysql数据库命令 单选_MySQL常用命令
  • 为什么a链接不起作用了_考前必读:原理题难点——最高点是平衡点?催化剂为什么能提高产率?...
  • create-react-app项目添加less配置
  • CSS3 变换
  • Django 博客开发教程 16 - 统计文章阅读量
  • Hibernate最全面试题
  • JavaScript服务器推送技术之 WebSocket
  • JS字符串转数字方法总结
  • Laravel 实践之路: 数据库迁移与数据填充
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • NSTimer学习笔记
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • rabbitmq延迟消息示例
  • ReactNative开发常用的三方模块
  • Twitter赢在开放,三年创造奇迹
  • TypeScript迭代器
  • Vue.js-Day01
  • VuePress 静态网站生成
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 基于 Babel 的 npm 包最小化设置
  • 简单实现一个textarea自适应高度
  • 精彩代码 vue.js
  • 力扣(LeetCode)357
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 树莓派 - 使用须知
  • 译米田引理
  • 关于Android全面屏虚拟导航栏的适配总结
  • 数据可视化之下发图实践
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #14vue3生成表单并跳转到外部地址的方式
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第61天)多租户架构(CDB/PDB)
  • (二十四)Flask之flask-session组件
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四) 虚拟摄像头vivi体验
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)菜鸟学数据库(三)——存储过程
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net framework4与其client profile版本的区别
  • .NET(C#) Internals: as a developer, .net framework in my eyes