Node.js 多次调整一个图像的大小

Node.js 多次调整一个图像的大小,node.js,sharp,Node.js,Sharp,我正在将给定的图像(保存在磁盘上)调整为不同的大小: var image = 'photos/pic'; var sizes = [1440, 1080, 720, 480]; for (var i = 0; i < sizes.length; i++) { sharp(image + '.jpg') .resize(sizes[i], sizes[i]) .toFile(image + '-' + sizes[i] + '.jpg'); } va

我正在将给定的图像(保存在磁盘上)调整为不同的大小:

var image = 'photos/pic';
var sizes = [1440, 1080, 720, 480];

for (var i = 0; i < sizes.length; i++) {
    sharp(image + '.jpg')
    .resize(sizes[i], sizes[i])
    .toFile(image + '-' + sizes[i] + '.jpg');       
}
var image='photos/pic';
变量大小=[14401080720480];
对于(变量i=0;i
这正如预期的那样有效,但我想还有改进的余地

  • for循环是否会导致任何问题?如果是,有没有更好的方法 为了解决这个问题
  • 等待生成的图片调整大小并将其用于下一个调整大小过程会更快吗?假设原始图片是
    2000x2000
    。将
    720x720
    调整为
    480x480
    而不是
    2000x2000
    调整为
    480x480
    ,如果有的话,速度有什么提高?考虑到我必须先读取
    720x720
    文件,然后等待大小调整完成
  • 我应该在“主”节点线程或分支子进程上进行这些调整吗?它们是异步运行的,对吗

您可以对Sharp JS使用克隆方法

这个例子提供了您所需要的一切

// Create the baseline changes
const pipeline = sharp().rotate();

pipeline.clone().resize(800, 600).pipe(firstWritableStream);
pipeline.clone().extract({ left: 20, top: 20, width: 100, height: 100 
  }).pipe(secondWritableStream);

readableStream.pipe(pipeline);

也可以将此与承诺一起使用

您可以使用蓝鸟承诺

const Promise = require('bluebird');
global.Promise = Promise;


var sizes = [{
path: 'large',
xy: 800
},{
    path: 'medium',
    xy: 300
},{
    path: 'small',
    xy: 100
}];
Promise.map(sizes, function(size) {
    return sharp( img.buffer )
        .resize( size.xy, size.xy )
        .toFile( size.path );
});
src:-


我试过了,它100%正常工作了。

我只想给出一些基本的评论:-首先缓存size.length,因为我们不需要像这样访问它4次:-var length=size.length;变量大小;对于(vari=0;i参考第三点,您使用的是什么库?您是如何假设它是异步的?从第一个外观开始调整大小似乎是同步的…如果它是异步的,正如您所说,当然会给您带来问题,因为forloop将在调整大小之前完成,因此它将生成4份1440像素的副本…明白了吗?请参阅标记。