对于一个数字艺术作品,我在Vue中生成了一个canvas元素,它从一个由多个图像组成的数组中进行绘制。图像可以分为两类:
- SVG(带有填充颜色)
- PNG(只需要绘制为常规图像)
"我想到了这个"
const depict = (options) => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
const myOptions = Object.assign({}, options);
if (myOptions.ext == "svg") {
return loadImage(myOptions.uri).then((img) => {
ctx.drawImage(img, 0, 0, 100, 100);
ctx.globalCompositeOperation = "source-in";
ctx.fillStyle = myOptions.clr;
ctx.fillRect(0, 0, 100, 100);
ctx.globalCompositeOperation = "source-over";
});
} else {
return loadImage(myOptions.uri).then((img) => {
ctx.fillStyle = myOptions.clr;
ctx.drawImage(img, 0, 0, 100, 100);
});
}
};
this.inputs.forEach(depict);
上下文:
myOptions.clr =颜色
myOptions.uri =图像的URL
myOptions.ext =图像的扩展名
虽然所有的图像都画得很好,但我不明白为什么最后一个填充样式会覆盖整个图像。我只是希望所有的SVG都有附加的填充样式。
我尝试了不同顺序的多个globalCompositeOperation
。我还尝试在ctx.save
和ctx.restore
之间绘制svg。没有成功...我可能在这里遗漏了一些逻辑。
1条答案
按热度按时间pgky5nke1#
所以!在此期间我自己想通了:)
我创建了一个带有promise的异步循环,在其中我为每个图像创建了一个临时画布,然后将其绘制到一个画布上,我从这个解决方案中获得了灵感:https://stackoverflow.com/a/6687218/15289586
下面是最终代码: