HTML-холст, используйте изображение в оттенках серого в качестве маски

Я пытаюсь применить маску, как это работает в Photoshop. Черный прозрачный, белый виден. Однако композитные режимы, я думаю, этого не позволяют.

Я могу найти только режимы, в которых используется альфа-канал, но я бы хотел использовать jpg для меньшего размера файла...


person nizzle    schedule 06.04.2017    source источник


Ответы (1)


Используйте getImageData и putImageData для доступа к необработанным данным пикселей.

Вам нужно вручную перемещать пиксели.

Для этого загрузите изображение, поместите его на холст, получите пиксели холста. Преобразовать в оттенки серого и перейти к альфа-каналу. Затем поместите пиксели обратно на холст.

var mask;
var image = new Image;
image.src = "image name.jpg";
image.onload = function(){
    var canvas = document.createElement("canvas");
    canvas.width = this.width;
    canvas.height = this.height;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(this,0,0);
    var data = ctx.getImageData(0,0,this.width,this.height);
    var i = 0;
    while(i < data.data.length){
        var rgb = data.data[i++] + data.data[i++] + data.data[i++];
        data.data[i ++]  = rgb / 3;
    }
    ctx.putImageData(data,0,0);
    mask = canvas;
}

После загрузки маска является копией изображения с альфа-каналом, содержащим среднее значение каналов RGB.

Чтобы использовать это

// ctx is the canvas context you want to draw to with the mask

if(mask){
     ctx.globalCompositeOperation = "destination-out";
     ctx.drawImage(mask,0,0);
     ctx.globalCompositeOperation = "source-over";
}
person Blindman67    schedule 06.04.2017