【问题标题】:Resize one image multiple times多次调整一张图像的大小
【发布时间】:2023-04-04 13:21:01
【问题描述】:

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

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');       
}

这按预期工作,但我想还有改进的余地。

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

【问题讨论】:

  • 我只提供基本的 cmets :- 首先缓存 size.length 因为我们不需要像这样访问它 4 次:- var length=sizes.length;变量临时大小; for(vari=0;i
  • 关于您的第三点,您使用的是什么库?你怎么认为它是异步的?从第一次看的调整大小似乎是同步的......如果它是异步的,就像你说的那样,它当然会给你带来问题,因为 forloop 将在调整大小之前完成,因此它将是 1440 像素的 4 个副本......你明白吗?
  • sharp,见标签。

标签: node.js sharp


【解决方案1】:

你可以通过使用 bluebird promise 来做到这一点

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 :- https://github.com/lovell/sharp/issues/154

我试过了,它是 100% 工作的

【讨论】:

    【解决方案2】:

    Sharp JS 可以使用 Clone 方法

    http://sharp.dimens.io/en/stable/api-input/#clone

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

    // 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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 2011-12-26
      • 2021-05-08
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多