Node.js 使用Javascript从S3调整图像大小
我正在使用knox软件包连接我的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
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
处理图像的方法,这样我就不需要将图像保存在本地磁盘中