Это в некоторой степени некромантия, но я только что столкнулся с этой проблемой и нашел решение, если не для оригинального плаката, то для таких людей, как я, из Google.
Как уже отмечалось, putImageData напрямую заменяет пиксели, а не альфа-смеси, но это также означает, что они сохраняют ваши альфа-данные. Затем вы можете перерисовать это изображение с помощью альфа-наложения, используя drawImage.
Для примера давайте представим, что у нас есть холст размером 200 на 100 пикселей и объект imageData размером 100 на 100.
// our canvas
var canvas = document.getElementById("mycanvas");
var ctx = canvas.getContext("2d");
// our imageData, created in whatever fashion, with alpha as appropriate...
var data = /* ... */
// lets make the right half of our canvas blue
ctx.fillStyle="blue";
ctx.rect(100, 0, 100, 100);
ctx.fill();
// now draw our image data to the left (white) half, pixels are replaced
ctx.putImageData(data, 0, 0, 100, 100);
// now the magic, draw the canvas to itself with clipping
ctx.drawImage(canvas, 100, 0, 100, 100, 100, 0, 100, 100);
Вуаля. Правая половина изображения теперь является данными вашего изображения, смешанными с синим фоном, с помощью аппаратного обеспечения.