Node.js 使用Javascript从S3调整图像大小

Node.js 使用Javascript从S3调整图像大小,node.js,npm,image-resizing,Node.js,Npm,Image Resizing,我正在使用knox软件包连接我的S3帐户并提取一个映像,如下所示: var picturestring; knoxclient.get(key).on('response', function(res){ console.log(res.statusCode); console.log(res.headers); res.setEncoding('base64'); res.on('data', function(chunk){ picturest

我正在使用knox软件包连接我的S3帐户并提取一个映像,如下所示:

var picturestring;
knoxclient.get(key).on('response', function(res){
    console.log(res.statusCode);
    console.log(res.headers);
    res.setEncoding('base64');
    res.on('data', function(chunk){
        picturestring += chunk;
    });
    res.on('end', function () {
        console.log(picturestring);
        resizeimage(picturestring, done); // use the resize library in this function
    });
}).end();
之后,我想使用一个库,它可以接收该字符串(picturestring),调整图像大小,并返回一个新的base64字符串,该字符串表示已调整大小的图像。此时,我计划将调整大小的图像上传到S3

我在Golang中编写了一个类似的脚本,允许我像这样调整图像大小,但我所回顾的每个JS大小调整库都只给出了调整本地文件系统中图像大小的示例

是否有任何方法可以避免将图像从S3读入文件系统,并专注于专门处理返回的字符串

*******************更新**************************************

function pullFromS3 (key, done) {
    console.log("This is the key being pulled from Amazon: ", key);
    var originalstream = new MemoryStream(null, {readable: false});
    var picturefile;
    client.get(key).on('response', function(res){
        console.log("This is the res status code: ", res.statusCode);
        res.setEncoding('base64');
        res.pipe(originalstream);
        res.on('end', function () {
            resizeImage(originalstream, key, done);
        });
    }).end();
};

function resizeImage (originalstream, key, done) {
    console.log("This is the original stream: ", originalstream.toString());
    var resizedstream = new MemoryStream(null, {readable: false});
    var resize = im().resize('160x160').quality(90);
    // getting stuck here ******
    originalstream.pipe(resize).pipe(resizedstream);
    done();
};
我似乎无法掌握从originalstream-->到resize ImageMagick函数-->再到resizestream的管道是如何工作的。理想情况下,resizestream应该为调整大小的图像保存base64字符串,然后我可以将其上载到S3

1) 如何等待管道完成,然后使用resizedstream中的数据


2) 我的配管正确吗?我无法调试它,因为我不确定如何等待管道完成

我使用的不是S3,而是中国的一家本地云提供商来存储图像及其缩略图。在我的例子中,我将
imagemagick
库与
imagemagick流
memorystream
模块一起使用

imagemagick-stream
提供了一种通过流使用
imagemagick
处理图像的方法,这样我就不需要将图像保存在本地磁盘中

memorystream
提供了一种将源图像和缩略图图像二进制文件存储在内存中的方法,并具有读取/写入流的能力

所以我的逻辑是

1,从客户端POST请求中检索图像二进制文件

2、使用
memorystream

3,将其上传到S3(在您的情况下)

4、在
imagemagick流中定义图像处理操作,例如调整大小为180x180

5、使用
memorystream
从步骤1中的原始图像二进制文件创建读取流,导入步骤4中创建的
imagemagick流
,然后导入由
memorystream
创建的可写新内存,其中存储缩略图

6,将步骤5中得到的缩略图上传到S3

我的解决方案中唯一的问题是,如果出现许多大型映像,您的虚拟机可能会耗尽内存。但我知道这不应该发生在我的情况下,所以没关系。但你最好自己评估一下


希望这能有所帮助。

我不是在使用S3,而是在中国的一家本地云提供商来存储图像及其缩略图。在我的例子中,我将
imagemagick
库与
imagemagick流
memorystream
模块一起使用

imagemagick-stream
提供了一种通过流使用
imagemagick
处理图像的方法,这样我就不需要将图像保存在本地磁盘中

memorystream
提供了一种将源图像和缩略图图像二进制文件存储在内存中的方法,并具有读取/写入流的能力

所以我的逻辑是

1,从客户端POST请求中检索图像二进制文件

2、使用
memorystream

3,将其上传到S3(在您的情况下)

4、在
imagemagick流中定义图像处理操作,例如调整大小为180x180

5、使用
memorystream
从步骤1中的原始图像二进制文件创建读取流,导入步骤4中创建的
imagemagick流
,然后导入由
memorystream
创建的可写新内存,其中存储缩略图

6,将步骤5中得到的缩略图上传到S3

我的解决方案中唯一的问题是,如果出现许多大型映像,您的虚拟机可能会耗尽内存。但我知道这不应该发生在我的情况下,所以没关系。但你最好自己评估一下


希望这能有所帮助。

我不是在使用S3,而是在中国的一家本地云提供商来存储图像及其缩略图。在我的例子中,我将
imagemagick
库与
imagemagick流
memorystream
模块一起使用

imagemagick-stream
提供了一种通过流使用
imagemagick
处理图像的方法,这样我就不需要将图像保存在本地磁盘中

memorystream
提供了一种将源图像和缩略图图像二进制文件存储在内存中的方法,并具有读取/写入流的能力

所以我的逻辑是

1,从客户端POST请求中检索图像二进制文件

2、使用
memorystream

3,将其上传到S3(在您的情况下)

4、在
imagemagick流中定义图像处理操作,例如调整大小为180x180

5、使用
memorystream
从步骤1中的原始图像二进制文件创建读取流,导入步骤4中创建的
imagemagick流
,然后导入由
memorystream
创建的可写新内存,其中存储缩略图

6,将步骤5中得到的缩略图上传到S3

我的解决方案中唯一的问题是,如果出现许多大型映像,您的虚拟机可能会耗尽内存。但我知道这不应该发生在我的情况下,所以没关系。但你最好自己评估一下


希望这能有所帮助。

我不是在使用S3,而是在中国的一家本地云提供商来存储图像及其缩略图。在我的例子中,我将
imagemagick
库与
imagemagick流
memorystream
模块一起使用

imagemagick-stream
提供了一种通过流使用
imagemagick
处理图像的方法,这样我就不需要将图像保存在本地磁盘中