溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ThinkPHP5 動(dòng)態(tài)生成圖片縮略圖的方法

發(fā)布時(shí)間:2020-12-31 15:17:16 來(lái)源:億速云 閱讀:252 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下ThinkPHP5 動(dòng)態(tài)生成圖片縮略圖的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

ThinkPHP5動(dòng)態(tài)生成圖片縮略圖

需求場(chǎng)景

不同終端(PC端、手機(jī)端、平板),不同界面(列表頁(yè)、詳情頁(yè)),對(duì)圖片大小的要求不一樣, 如果所有場(chǎng)景下都使用同一尺寸的圖片,勢(shì)必對(duì)會(huì)網(wǎng)絡(luò)帶寬及服務(wù)器性能造成一定的影響,由此需要服務(wù)器端能夠根據(jù)前端的請(qǐng)求參數(shù),自動(dòng)匹配出相對(duì)應(yīng)的圖片資源,以此來(lái)降低服務(wù)端的壓力,同時(shí)也能給用戶帶來(lái)更友好的用戶體驗(yàn)。

具體步驟如下:

1、開啟apache的rewrite功能,具體方法請(qǐng)自行百度。

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>

以上配置規(guī)則表示,如果存在對(duì)應(yīng)的圖片資源,則由apache直接返回,如果不存在,則轉(zhuǎn)發(fā)給/index.php/api/Attachment/thumbnail處理器去處理。

其它參數(shù)說(shuō)明:

$1:圖片所屬模塊

$2:圖片上傳日期

$3:原始圖片名稱(不含后綴)

$4:目標(biāo)圖片寬度

$5:目標(biāo)圖片高度

$6:圖片后綴

友情提示:根據(jù)圖片存儲(chǔ)規(guī)則的不同,此處的配置規(guī)則及參數(shù)可以作相應(yīng)的調(diào)整。

3、新增縮略圖處理程序,此處為Attachment 文件,內(nèi)容如下:

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'];    // 目標(biāo)圖片寬度
        $height = $params['height'];  // 目標(biāo)圖片高度
        $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文件中新增一個(gè)方法,內(nèi)容如下:

/**
     * 預(yù)覽圖像
     * @param int         $quality   圖像質(zhì)量
     * @param bool        $interlace 是否對(duì)JPEG類型圖像設(shè)置隔行掃描
     * @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圖像設(shè)置隔行掃描
            imageinterlace($this->im, $interlace);
            imagejpeg($this->im, null, $quality);
        } elseif ('gif' == $type && !empty($this->gif)) {
            imagegif($this->im, null);
        } elseif ('png' == $type) {
            //設(shè)定保存完整的 alpha 通道信息
            imagesavealpha($this->im, true);
            //ImagePNG生成圖像的質(zhì)量范圍從0到9的
            imagepng($this->im, null, min((int) ($quality / 10), 9));
        } else {
            $fun = 'image' . $type;
            $fun($this->im, '');
        }
       exit;
    }

5、訪問(wèn)示例

在瀏覽器中輸入:https://cache.yisu.com/upload/information/20201208/264/22349.jpg,將會(huì)看到一張寬320,高240的圖片。

以上是“ThinkPHP5 動(dòng)態(tài)生成圖片縮略圖的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI