使用清晰的流调整大小的lambda图像(需要添加元数据)
我发现一种方法遇到了问题,该方法使用了在node.js中通过imagemagic在gm中运行的异步瀑布,因为它在非常大的图像上无法显示。 gm github中有许多线程,但它们似乎暗示缓冲区的大小有最大限制。
所以我正在寻找其他方法,到目前为止,看起来最有前途的库非常清晰。我也找到了一些我喜欢的使用流技术的示例,但是我不知道是否有一种方法可以在此过程中提取图像信息。
我看到有一个.metadata()功能,但是我不确定如何将其与流.pipe()设置结合使用以检索元数据,以便稍后将其用于s3上传,以及然后也对我的图像进行调整大小。
我还需要从原始s3下载中检索一些详细信息。下面是我正在使用的代码,已经使用非常大的图像对其进行了测试,并且可以很好地调整其大小。但是我仍然需要在上传文件上标记一些元数据,以帮助自己管理缩略图。
我需要的数据种类包括:
原始图像的宽度,高度和模仿度原始图像文件大小(以字节为单位),原始图像文件mtime(我将其存储在unix时代)
由于S3不允许修改元数据,因此我利用我需要通过Web界面创建缩略图的事实,以在创建缩略图时检索原始文件信息,然后在下载缩略图或通过一个headObject()调用我们的用户界面需要做的事情。
下面是我使用Sharp()工具使用的代码,并且我已经验证了它可以很好地处理破坏我使用的gm()调整大小方法的真正大图像。我喜欢它如何使用.pipe()流,但是,如果有更好的方法,则不需要这样做。我只是不确定在该语法中如何/在何处可以提取文件详细信息以及图像宽度/高度以在上传缩略图之前构建“元数据”数组。
感谢您的任何帮助!
// placeholder for the metadata I need to upload:
let metadata = {
"mtime" : null, // original image timestamp - from getObject response
"size" : null, // original image content length - from getObject response
"type" : null, // original image Content-Type - from getObject response
"width" : null, // original image width - formerly retrieved with gm.size()
"height" : null // original image height - formerly retrieved with gm.size()
}
var AWS = require("aws-sdk")
this.s3 = new AWS.S3()
const sharp = require('sharp');
const stream = require('stream')
const pass = new stream.PassThrough()
const readStream = this.s3.getObject({ "Bucket":bucket, "Key":key }).createReadStream()
const resizeStream = sharp().resize(MAX_WIDTH, MAX_HEIGHT, {fit: sharp.fit.inside}).toFormat('jpg')
const writeStream = pass
readStream
.pipe(resizeStream)
.pipe(writeStream)
this.s3.upload({
"Bucket": thumbBucket,
"Key": thumbKey,
"Body": pass,
"ContentType": 'image/jpg',
"Metadata": metadata
}).then(/* do stuff with upload result*/)
回答如下:您可以使用npm软件包 imagemagick,这对我有用。希望对您有帮助。
import * as AWS from 'aws-sdk';
import { s3Bucket } from '../../utils/config';
import * as im from 'imagemagick';
const s3 = new AWS.S3();
const resizeS3ImageOnFly = async (event, context, callback) => {
let bucketName = await s3Bucket(process.env.stage) //S3 BUCKET Name
const key = 'zxxxxxxx.png'; // Image S3 Key
const size = { width: 200, height: 200 };
const data = await s3.getObject({ Bucket: bucketName, Key: key }).promise();
if (size.width && size.height && data) {
im.crop({
srcData: data.Body,
dstPath: 'cropped.jpg',
width: 800,
height: 600,
quality: 1,
gravity: "Center"
}, err => {
console.log("balue..........................")
})
} else {
// Handle the condition
}
}
export default resizeS3ImageOnFly;