我的任务是将几个 png 堆叠在另一个之上并将其导出为一个 png。图像的大小不同,但它们不需要调整大小,只需裁剪到可用的画布即可。
图像来自文件系统并作为缓冲区发送。可能有 8 到 30 张图像。
我的测试使用了 10 张图像,我将它与 node-canvas 进行了比较,它所花费的时间不到 Sharp 的 50%。我认为 Sharp 的一个问题是我必须extract
在合成之前进行制作和操作。
这是我使用 Sharp 运行的代码,需要 600 毫秒,包含 10 张图像:
export const renderComponentsSHARP = async ( layers )=>{
const images = [];
for(let i=0; i<layers.length; i++){
const layer = sharp(layers[i]));
const meta = await layer.metadata();
if(meta.height > AVATAR_SIZE.height || meta.width > AVATAR_SIZE.width)
layer.extract({ top:0, left:0, ...AVATAR_SIZE });
images.push({input:await layer.toBuffer()});
}
return sharp({
create: {
...AVATAR_SIZE,
channels: 4,
background: { r: 0, g: 0, b: 0, alpha: 0 }
}})
.composite(images)
.png()
.toBuffer();
};
这是我在画布上运行的代码,大约需要 280 毫秒:
export const renderComponentsCANVAS = async ( layers )=>{
const canvas = createCanvas(AVATAR_SIZE.width, AVATAR_SIZE.height);
const ctx = canvas.getContext('2d');
const images = await Promise.all(layers.map( layer=>loadImage(layer)));
images.forEach(image=>{
ctx.drawImage(image, 0, 0);
});
return canvas.toBuffer();
};
我做错了什么尖锐吗?或者它不是这项工作的工具?