Можно наложить изображение, нарисованное на холсте, проанализировав каждый пиксель нарисованного изображения, а затем наложив прямоугольник 1x1 на нужный цвет. Вот пример того, как это сделать:
function overlayColor(img,x,y,a,r,g,b,drawWidth,drawHeight){
//create a canvas in memory and draw the image there to analyze it
var tmpCanvas = document.createElement('canvas');
var context = tmpCanvas.getContext('2d');
tmpCanvas.width = drawWidth;
tmpCanvas.height = drawHeight;
context.drawImage(img,0,0,drawWidth,drawHeight);
let pData = new Array();
for (let i = 0; i < tmpCanvas.width; i++){
for (let j = 0; j < tmpCanvas.height; j++){
if (context.getImageData(i, j, 1, 1).data[3] != 0){//if the pixel is not transparent then add the coordinates to the array
pData.push([i,j]);
}
}
}
//then every pixel that wasn't transparent will be overlayed with a 1x1 rectangle of the inputted color
//drawn at the (x,y) origin which was also given by the user
//this uses ctx, the context of the canvas visible to the user
ctx.fillStyle="rgba(" + r + "," + g + "," + b + "," + a + ")";
for (let i = 0; i < pData.length; i++){
ctx.fillRect(x + pData[i][0],y + pData[i][1],1,1);
}
}
Поскольку функция принимает значения x и y, изображение, предоставленное пользователем, будет проанализировано и наложено только на пиксели, которые не являются прозрачными по координате, заданной пользователем, с учетом значения rgba. Я обнаружил, что этот процесс может привести к некоторой задержке, но его можно преодолеть, сохранив массив pData и используя вторую половину функции, чтобы снова нарисовать массив на экране.