最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用清晰的流调整大小的lambda图像(需要添加元数据)

运维笔记admin9浏览0评论

使用清晰的流调整大小的lambda图像(需要添加元数据)

使用清晰的流调整大小的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;
发布评论

评论列表(0)

  1. 暂无评论