Через CSS
Если фон прозрачный, измените холст CSS background-color
.
С помощью глобальной композитной операции
Если вам нужны пиксели холста установите цвет, затем используйте ctx.globalCompositeOperation = "destination-over"
для рендеринга только прозрачных и полупрозрачных пикселей.
Если фоновые пиксели уже имеют цвет, то это проблема.
Через копию холста переднего плана
Это метод с наименьшими проблемами. по сути, он создает второй слой (передний план), который вы можете визуализировать поверх фона (слоя)
Копировать холст
Чтобы скопировать холст (передний план)
function copyCanvas(canvas) {
const copy = document.createElement("canvas");
copy.width = canvas.width;
copy.height = canvas.height;
const ctx = copy.getContext("2d");
ctx.drawImage(canvas, 0, 0); // render canvas to new canvas
return copy;
}
Вы также можете использовать OffscreenCanvas или ImageBitmap
, хотя метод копирования немного отличается от указанного выше. (ТАКЖЕ проверьте поддержку браузера)
Слои рендеринга
Когда у вас есть копия пикселей переднего плана, вы можете рендерить фон, а затем передний план для окончательного результата
this.picker.onChange = async (color) => {
const ctx = this.context;
if (this.foreGround === undefined) { // create copy only when needed
this.foreGround = copyCanvas(ctx.canvas);
}
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); // in case color is semi transparent
ctx.fillStyle = color;
ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.drawImage(this.foreGround, 0, 0);
}
Если вы меняете пиксели переднего плана, просто создаете новую копию изменений. Например, в приведенном выше примере просто установите this.foreGround = undefined
перед добавлением фона, и холст будет скопирован