对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))
原始大图:
调整大小的图片:注意它也已旋转:
答案 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