温馨提示×

温馨提示×

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

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

如何使用Node.js压缩图片

发布时间:2021-07-23 17:31:54 来源:亿速云 阅读:202 作者:chen 栏目:web开发

这篇文章主要讲解了“如何使用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<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图片:

如何使用Node.js压缩图片

用我们的插件上传后,打开链接看看:

如何使用Node.js压缩图片

图片压缩成功啦~~

三、解决遗留bug

在使用时发现了一个问题就是有时候编辑器会突然变卡,后来找到原因是在链接中有空格时会一直卡住,之后hover其他内容也都没有响应。于是就将hover的字符串空格去掉再执行后面的获取链接方法可以了:

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

感谢各位的阅读,以上就是“如何使用Node.js压缩图片”的内容了,经过本文的学习后,相信大家对如何使用Node.js压缩图片这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

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

AI