调整大小时,锐利图像库会旋转图像吗?

时间:2018-02-10 01:14:08

标签: node.js amazon-s3 aws-lambda image-resizing sharp

对node.js使用清晰图像调整大小库https://github.com/lovell/sharp时,图像正在旋转。

我没有代码说.rotate(),为什么它会被旋转?如何阻止它旋转呢?

我正在使用AWS提供的无服务器映像大小调整示例:https://github.com/awslabs/serverless-image-resizing如果缩略图不存在,则使用lambda动态调整图像大小

S3.getObject({Bucket: BUCKET, Key: originalKey}).promise()
.then(data => Sharp(data.Body)
      .resize(width, height)
      .toFormat('png')
      .toBuffer()
    )
.then(buffer => S3.putObject({
        Body: buffer,
        Bucket: BUCKET,
        ContentType: 'image/png',
        Key: key,
      }).promise()
    )
.then(() => callback(null, {
        statusCode: '301',
        headers: {'location': `${URL}/${key}`},
        body: '',
      })
    )
.catch(err => callback(err))

原始大图:

enter image description here

调整大小的图片:注意它也已旋转:

enter image description here

5 个答案:

答案 0 :(得分:8)

问题实际上是这样的:当您调整图像大小时,exif数据会丢失。 exif数据包括图像的正确方向,即哪个方向上升。

幸运的是,sharp确实有一个保留exif数据的功能deck[]。因此,上面的代码需要更改为:

.withMetadata()

(请注意,您还需要删除S3.getObject({Bucket: BUCKET, Key: originalKey}).promise() .then(data => Sharp(data.Body) .resize(width, height) .withMetadata() // add this line here .toBuffer() ) 调用,因为png对jpeg的exif没有相同的支持)

现在它工作正常,调整后的图像是正确的方式。

答案 1 :(得分:1)

另一种解决方案是在.rotate()之前实际调用resize。这将基于EXIF数据自动调整图像的方向。

.then(data => Sharp(data.Body)
      .rotate()
      .resize(width, height)
      .toBuffer()
    )

docs中的更多详细信息。

通过这种方式,您无需保留原始元数据,从而使整体图像尺寸较小。

答案 2 :(得分:0)

针对无服务器图像处理程序5.0的更新答案,此方法自10/2020开始使用CloudFormation Stack模板进行部署:

我将.rotate()附加到image-handler.js的第50行,它的工作原理就像是一种魅力:

const image = sharp(originalImage, { failOnError: false }).rotate();

答案 3 :(得分:0)

 const data = await sharp(file_local)
    .resize({
      width: px,
     
  })
    .jpeg({
      quality: quality,
      progressive: true,
      chromaSubsampling: "4:4:4",
    })
    .withMetadata()
    .toFile(file_local_thumb);

使用(.withMetadata()),以防止图像旋转。

另外,您可以传递仅宽度参数,不需要高度。

答案 4 :(得分:0)

我以一种相关的方式修复了这个问题,特定于 AWS 无服务器图像处理程序,而没有更改代码。我正在编辑列表中传入 "rotate":null

在阅读最新的 (5.2.0) 代码时,他们似乎试图解决这个问题,但直到我添加 "rotate":null

这是 Github 上的一个相关问题:https://github.com/awslabs/serverless-image-handler/issues/236