如何使用Sharp包压缩PNG文件?

Posted

技术标签:

【中文标题】如何使用Sharp包压缩PNG文件?【英文标题】:How to compress PNG file using sharp package? 【发布时间】:2018-11-22 13:19:37 【问题描述】:

我正在尝试使用 node.js sharp 包压缩 PNG 文件(1MB 以上)。

var sharp = require('/usr/local/lib/node_modules/sharp');
sharp('IMG1.png')
.png( compressionLevel: 9, adaptiveFiltering: true, force: true )
.withMetadata()
.toFile('IMG2.png', function(err)
    if(err)
        console.log(err);
     else 
        console.log('done');
    
); 

以上代码无法正常工作。我的文件大小约为 3.5MB,我正在尝试将其压缩到 1MB 左右。

【问题讨论】:

“无法正常工作”是什么意思? 表示不压缩图片,3.5MB图片结果为3.5MB。 可能不能再压缩一点? PNG是无损的 【参考方案1】:

使用您提供的代码进行了尝试,效果很好,并且还可以在一定程度上压缩图像

var sharp = require('sharp');
sharp('input.png')
    .png( compressionLevel: 9, adaptiveFiltering: true, force: true )
    .withMetadata()
    .toFile('output.png', function(err) 
        console.log(err);
    );

我附上了截图。它将显示图像大小的差异。

【讨论】:

【参考方案2】:

如果您曾尝试压缩位图/光栅图像,您会发现它的压缩效果不佳,它实际上只是压缩了元数据。

PNG 是无损格式,因此quality 参数控制颜色深度。默认是无损的,quality: 100 保留全色深度。当这个百分比减少时,它使用颜色palette 并减少颜色。

var sharp = require('/usr/local/lib/node_modules/sharp');
sharp('IMG1.png')
.withMetadata() // I'm guessing set the metadata before compression?
.png(
  quality: 95, // play around with this number until you get the file size you want
  compression: 6, // this doesn't need to be set, it is by default, no need to increase compression, it will take longer to process
)
.toFile('IMG2.png', function(err)
    if(err)
        console.log(err);
     else 
        console.log('done');
    
); 

【讨论】:

以上是关于如何使用Sharp包压缩PNG文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Linux上使用tar命令解压和压缩文件

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

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

PNG文件大小如何压缩?

迅捷在线压缩如何压缩图片文件?压缩成png怎么操作?

PNG文件大小如何压缩?