温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ThinkPHP5 动态生成图片缩略图的方法

发布时间:2020-12-31 15:17:16 来源:亿速云 阅读:315 作者:小新 栏目:编程语言

小编给大家分享一下ThinkPHP5 动态生成图片缩略图的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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、访问示例

在浏览器中输入:https://cache.yisu.com/upload/information/20201208/264/22349.jpg,将会看到一张宽320,高240的图片。

以上是“ThinkPHP5 动态生成图片缩略图的方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI