侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ThinkPHP5 动态生成图片缩略图

ThinkPHP  /  管理员 发布于 8年前   258

ThinkPHP5动态生成图片缩略图

需求场景

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

具体步骤如下:

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

2、修改.htaccess

<IfModule mod_rewrite.c>  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]</IfModule>

以上配置规则表示,如果存在对应的图片资源,则由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的图片。

以上就是ThinkPHP5 动态生成图片缩略图的详细内容,更多请关注其它相关文章!


  • 上一条:
    thinkphp和laravel性能比较
    下一条:
    今日新课推荐:《Thinkphp6.0正式版视频教程》
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客