在 node.js 中使用Sharp压缩图像

Posted

技术标签:

【中文标题】在 node.js 中使用Sharp压缩图像【英文标题】:Compress image using sharp in node.js 【发布时间】:2018-12-19 20:39:26 【问题描述】:

我想在node.js 中使用sharp 调整图像大小和压缩图像

jpeg 有单独的压缩,webp 有单独的压缩,png 有单独的压缩。

WEBP

sharp('a.jpg')
.resize(1000)
.webp(quality: 80)

JPEG

sharp('_4_.jpg')
 .resize(1000)
 .jpeg(quality: 80)

PNG

sharp('_4_.jpg')
 .resize(1000)
 .png(compressionLevel: 8)

基本上我想压缩和调整图像大小而不检查它们的格式。

sharp 有什么相关的吗?

【问题讨论】:

您为什么不检查扩展名并采取相应措施?如果您想要更精确的检测,您可以读取图像的第一个字节,但我认为没有必要。 是的,这是一个解决方案,但我想这样做而不是检查 我检查但没有找到...这就是我发布问题的原因 不同的格式需要不同的方法解码和编码,所以检查扩展是个好主意。 【参考方案1】:

如果您希望输出格式与输入格式匹配,您应该查看force 选项。

sharp(input)
  .jpeg( progressive: true, force: false )
  .png( progressive: true, force: false )
  ...

不支持GIF输出,所以GIF输入默认会变成PNG输出。

其他参考:https://sharp.readthedocs.io/en/v0.17.0/api-output/#jpeg

【讨论】:

【参考方案2】:

PNG 也是quality,但由于它是无损格式,默认设置为100。其中 JPG 默认设置为80

通过减少 PNG 的 quality,它将启用 palette 模式,这将减少编码中捕获的颜色数量。这将为文件提供一些很好的缩减。

compression 只是 zlib / zip 压缩,还没有发现它做了多少 TBH。

文档中的所有内容:https://sharp.pixelplumbing.com/api-output#png

// this will disable loss-less mode, and reduce the colour accuracy to 90%
// it will also enable the palette
sharp('_4_.jpg')
 .resize(1000)
 .png(quality: 90)

【讨论】:

【参考方案3】:

您可以使用metadata方法抓取文件格式并选择相应的优化方法:

const image = sharp('_4_.jpg')
const meta = await image.metadata()
const  format  = meta

const config = 
  jpeg:  quality: 80 ,
  webp:  quality: 80 ,
  png: compressionLevel: 8,


await image[format](config[format])
  .resize(1000)

【讨论】:

以上是关于在 node.js 中使用Sharp压缩图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js 和 Sharp 包将非裁剪调整为 png

使用 Sharp 压缩图像大小而不改变图像的纵横比

sharp.js中文文档

5款Node.js相关的图片工具

Nodejs Sharp webp无损压缩

这样使用Node.js压缩PNG图片,效果高达75%