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

Posted

技术标签:

【中文标题】使用 Sharp 压缩图像大小而不改变图像的纵横比【英文标题】:Using Sharp to compress image size without changing aspect ratio of the image 【发布时间】:2019-01-03 16:22:56 【问题描述】:

我有一个 aws 图像文件,我正在使用 sharp 压缩图像,但压缩后,文件大小急剧增加。就我而言,我的图像大小为 6.5MB ,压缩后变为 19.5MB。

以下是我的代码:

const width = parseInt(image.height);
const height = parseInt(image.width);

var getObjectParams = 
  Bucket: BUCKET,
  Key: FILE_NAME


  s3.getObject(getObjectParams).promise()
    .then(data => 
      sharp(data.Body)
       .resize(width, height)
        .ignoreAspectRatio()
        .toFormat('png')
        .toBuffer()
        .then((buffer) => 
         ........
         ........
    

我什至尝试过使用.max()

 sharp(data.Body)
 .withoutEnlargement()
 .resize(width, height)
 .toFormat('png')
 .toBuffer()

同样的问题,文件大小在增加。在我的情况下,应该保持图像纵横比。任何建议,将不胜感激。谢谢

【问题讨论】:

你已经在github.com/lovell/sharp/issues 上问过这个问题了吗?如果没有,请这样做,因为作为一个开源库,这确实是第一个要问的地方。 @Mike'Pomax'Kamermans 是的,我在 github 上问过 github.com/lovell/sharp/issues/1307 好。看起来你会想在那里编辑你的问题,github有不同的代码格式格式(SO使用缩进,GH在你的代码块之前和之后使用```) @Mike'Pomax'Kamermans,谢谢你的建议,我会调查一下 【参考方案1】:

这是Sharp 的一个常见问题,但这是一个很棒的包。阅读Sharp documentation 获取png

如果您需要玩耍; options.qualityoptions.coloursoptions.dither 压缩大量的任何 PNG 图像,并根据其文档,

需要编译支持 libimagequant 的 libvips

所以你需要libimagequant 的帮助来实现你的目标。 据该网站称,libimagequant 是一个小型、可移植的 C 库,用于将 RGBA 图像高质量转换为 8 位索引颜色(调色板)图像。

相反,您可以使用this NPM PACKAGE called imagemin,我相信它使用相同的方法来压缩 PNG 图像。使用下面的一小段代码,你可以减小 PNG 的大小。

const files = await imagemin(['images/*.png'], 
    destination: 'build/images',
        plugins: [
            imageminJpegtran(),
            imageminPngquant(
                quality: [0.6, 0.8]
            )
        ]
);

使用quality: [0.6, 0.8]quality: [0.2, 0.2] 来减少大小,你可以传递一个像const files = await imagemin(['fileName.png'] 这样的图像文件

【讨论】:

以上是关于使用 Sharp 压缩图像大小而不改变图像的纵横比的主要内容,如果未能解决你的问题,请参考以下文章

图像的 UIPageViewController 如何在方向改变时保持图像的纵横比?

调整图像大小并裁剪为新的纵横比

调整图像大小以使大小与指定的纵横比匹配[重复]

在 PHP 中将图像裁剪为正方形,而不是调整为相同的纵横比

IOS:根据图片大小改变UICollectionView Cell大小

OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码