Используя маску изображения с globalCompositeOperation на KonvaJS?

Я использую фреймворк Konva.js и пытаюсь применить маску изображения поверх другой. Код полностью скопирован из этого поста. В этом примере jsfiddle есть небольшие модификации для добавления фона (Rect).

Проблема в том, что фон нарисован неправильно. Чтобы увидеть это в действии, в коде есть строка для комментария / раскомментирования (чтобы увидеть проблему в действии). У кого-нибудь есть идеи для достижения этой цели?

Лучший

let stage = new Konva.Stage({
    container: 'container',
    width: window.innerWidth,
    height: window.innerHeight
});

let layer = new Konva.Layer();
let rect = new Konva.Rect({
    x: 0,
    y: 0,
    width: 900,
    height: 900,
    draggable: true,
    fill: '#ff8619',
});

// -------------------------------------
// Line to comment or uncomment
//layer.add(rect);
// -------------------------------------

stage.add(layer);

let mask = new Image();
mask.onload = () => {
    let img = new Image();
    img.onload = () => {
        let image = new Konva.Shape({
            sceneFunc: (ctx) => {
                ctx.save();
                ctx.drawImage(mask, -image.x(), -image.y(),  200, 200);
                ctx.globalCompositeOperation = 'source-in';
                ctx.drawImage(img, 0, 0, 200, 200);
                ctx.globalCompositeOperation = 'source-over';
                ctx.restore();
            },
            // (!) important
            // for this case you need to define custom hit function
            hitFunc: (ctx) => {
                ctx.rect(0, 0, 200, 200);
                ctx.fillStrokeShape(image);
            },
            draggable: true
        });
        layer.add(image);
        layer.draw();
    };
            img.src = "http://i.imgur.com/kKjW3U4.png";

};
        mask.src = "http://i.imgur.com/fQX2P8S.png";

1 ответ

Проблема была в том, что вам нужно было:

1. добавьте новый слой: let layer2 = new Konva.Layer();
2. добавьте его на сцену в правильном порядке: stage.add(layer2, layer);

Вот обновленный:
пример jsfiddle

Другие вопросы по тегам