首頁 > web前端 > js教程 > 主體

使用Node.js怎麼壓縮圖片?方法介紹

青灯夜游
發布: 2021-07-30 10:27:57
轉載
4724 人瀏覽過

使用Node.js怎麼壓縮圖片?以下這篇文章跟大家介紹一下使用Node.js實作圖片壓縮的方法,一起來看看吧!

使用Node.js怎麼壓縮圖片?方法介紹

一、內容簡介

#前段時間開發了上傳圖片到七牛的Vscode外掛,當時還差了一個功能:圖片壓縮,這次也終於解決了;同時還解決了一個遺留bug(鏈接內有空格編輯器會卡住),現在已經可以算是一個有完整功能的插件了,有興趣的小夥伴可以在Vscode中搜尋外掛程式upload-to-qiniu進行安裝。

【推薦學習:《nodejs 教學》】

#效果預覽:

使用Node.js怎麼壓縮圖片?方法介紹

##二、node壓縮圖片

一開始是打算用

TinyPNG的API實現圖片壓縮,但是嘗試過後發現壓縮速度特別慢,而且好像還要花錢,果斷就放棄了。改為使用imagemin

這裡是有一個坑的: 由於

imagemin不可以直接壓縮圖片,而是需要依賴imagemin-jpegtranimagemin-pngquant ,但在安裝imagemin-pngquant時會安裝不了,找到了一個原因是說這個庫是基於一些底層語言實現,所以不能直接安裝,需要在電腦上安裝另一個依賴libpng

安裝libpng

直接貼一個安裝brew的位址:

zhuanlan.zhihu.com/p/90508170,只要對著他說的敲擊指令基本上就可以安裝brew啦。最後我們再執行brew install libpng,等到libpng安裝成功後,到專案中安裝imagemin-pngquant就可以安裝上了。

程式碼實現壓縮圖片根據需求我們肯定不希望他將圖片壓縮後放在資料夾裡,而是需要在程式碼中直接取得到壓縮後的內容,直接上傳到七牛。那就要用imagemin.buffer,這個方法透過接收一個buffer對象,經過壓縮後再回傳一個buffer,我們只要用壓縮後的buffer直接上傳到七牛,想法就是這樣,下面是程式碼實作:

// 获取buffer
export const getBufferFromFile = (filePath: string): Promise => {
  return new Promise((resolve, reject) => {
    fs.readFile(filePath, function (err: any, res: any) {
      if (!err) {
        resolve(res)
      }
    })
  })
}


// 压缩图片,传入图片文件路径,通过getBufferFromFile方法转为buffer 后进行压缩
const imageGzip = async (loaclFile: string): Promise => {
  const bufferFile = await getBufferFromFile(loaclFile)
  let res
  try {
    res = await imagemin.buffer(bufferFile, {
      plugins: [
        imageminJpegtran(),
        imageminPngquant({
          quality: [0.6, 0.8],
        }),
      ],
    })
  } catch (err) {
    console.log('error', err)
    res = null
  }
  return res
}
登入後複製

這樣我們就可以很容易的實現了,圖片壓縮,現在我們再改寫一下上傳到七牛:因為之前沒有壓縮我們可以直接傳檔案路徑上傳七牛,壓縮後我們只有buffer了,需要上傳buffer到七牛:

gzipImage ? 'putStream' : 'putFile',如果我們是取得到buffer就使用formUploader .putStream,否則只需要formUploader.putFile上傳

export const upImageToQiniu = async (
  loaclFile: string,
  cb: { (res: any): void; (arg0: any): void },
  upConfig: QiNiuUpConfig
) => {
  const config = new qiniu.conf.Config()
  const formUploader = new qiniu.form_up.FormUploader(config)
  const putExtra = new qiniu.form_up.PutExtra()
  const token = getToken(upConfig.accessKey, upConfig.secretKey, upConfig.scope)
  let gzipImage
  if (upConfig.gzip) {
    gzipImage = await imageGzip(loaclFile)
  }
  // 获取当前时间戳
  var key = new Date().getTime()
  // 上传调用方法
  const uploadFnName = gzipImage ? 'putStream' : 'putFile'
  // 上传内容
  const uploadItem = gzipImage ? bufferToStream(gzipImage) : loaclFile
  // 七牛上传
  formUploader[uploadFnName](
    token,
    key,
    uploadItem,
    putExtra,
    function (respErr: any, respBody: any, respInfo: any) {
      if (respErr) {
        throw respErr
      }

      if (respInfo.statusCode === 200) {
        const url = upConfig.domain + '/' + respBody.key
        cb(url)
      }
    }
  )
}
登入後複製

現在我們可以實驗一下效果:

#在電腦中選擇一張png圖片:

使用Node.js怎麼壓縮圖片?方法介紹

#用我們的外掛上傳後,打開連結看看:

使用Node.js怎麼壓縮圖片?方法介紹

#圖片壓縮成功啦~~

##三、解決遺留bug

在使用時發現了一個問題就是有時候編輯器會突然變卡,後來找到原因是在連結中有空格時會一直卡住,之後hover其他內容也都沒有響應。於是就將hover的字串空格去掉再執行後面的獲取連結方法可以了:

// 当前行的文本内容
const currentLineText = document.lineAt(position).text.replace(/\s+/g, "")
登入後複製

#四、結束

因為在hover預覽圖時為防止有些圖片過大載入慢,加了七牛的裁切參數,所以可能其他類型的圖片連結會不能預覽,後面會慢慢解決噠^ ^。我已經將外掛程式原始碼上傳至
github

,歡迎大家點個start^ ^。如果對插件還有更好的想法也可以互相交流。

更多程式相關知識,請造訪:
程式設計入門

! !

以上是使用Node.js怎麼壓縮圖片?方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:掘金--liangyue
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!