в общем, можно так сделать: пример
// рисуем непрозрачную картинку
ctx.fillStyle = "rgba(0,0,0, 1)";
ctx.fillRect(0, 0, 100, 100);
// выставляем режим замещения
ctx.globalCompositeOperation = "copy";
// делаем область отсечения. Это нужно, если кроме картинки на канве ещё что-то есть,
// и это что-то не должно потеряться из-за "copy"
ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(0,100);
ctx.lineTo(100,100);
ctx.lineTo(100,0);
ctx.closePath();
ctx.clip();
// рисуем полупрозрачную картинку. она сначала затрет старую, потом нарисуется.
ctx.fillStyle = "rgba(0,0,0, 0.5)";
ctx.fillRect(0, 0, 100, 100);