使用Node.js怎麼壓縮圖片?以下這篇文章跟大家介紹一下使用Node.js實作圖片壓縮的方法,一起來看看吧!
#前段時間開發了上傳圖片到七牛的Vscode外掛,當時還差了一個功能:圖片壓縮,這次也終於解決了;同時還解決了一個遺留bug(鏈接內有空格編輯器會卡住),現在已經可以算是一個有完整功能的插件了,有興趣的小夥伴可以在Vscode中搜尋外掛程式
upload-to-qiniu
進行安裝。【推薦學習:《nodejs 教學》】
#效果預覽:
TinyPNG的API實現圖片壓縮,但是嘗試過後發現壓縮速度特別慢,而且好像還要花錢,果斷就放棄了。改為使用
imagemin。
imagemin不可以直接壓縮圖片,而是需要依賴
imagemin-jpegtran和
imagemin-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<Buffer> => { 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<any> => { 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圖片:
#用我們的外掛上傳後,打開連結看看: #圖片壓縮成功啦~~##三、解決遺留bug
// 当前行的文本内容 const currentLineText = document.lineAt(position).text.replace(/\s+/g, "")#四、結束
github更多程式相關知識,請造訪:程式設計入門
以上是使用Node.js怎麼壓縮圖片?方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!