2

I have an HTML5 Canvas. I am using the KineticJS(KonvaJS) canvas library. On a blank canvas I dram an image as shown in the figure below. Now I want to create a circle Shape which can be used to erase parts of the image. The red circle in the image is the eraser.

enter image description here

How can I erase parts of an Image on HTML5 Canvas?

4

3 に答える 3

3

詳細な回答をしてくれたmarkEに感謝します。

からコンテキストを取得しようとしましたが、Konva.Layer()うまくいきました。

    var freeHandDrawingImage = new Image();
    freeHandDrawingImage.onload = function() {
        var context = freeHandDrawingLayer.getContext('2d');
        context.drawImage(this, 0,0);
        context.globalCompositeOperation='destination-out';
        freeHandDrawingLayer.draw();
    };
    freeHandDrawingImage.src = "image.png";

を使用して、カスタムでKonva.Shape消去"destination-out"および自由な描画を行いました"source-over"

freeDrawingType = 'brush';
isFreeDrawingMode = false;
isPaint = false;
lastPointerPosition = {};

drawFreeDrawings = function(){

    var freeDraw = new Konva.Shape({
        name: "freeDraw",
        stroke: 'black',
        strokeWidth: 5,
        closed : false,
        sceneFunc: function(context){
            // free draw quad
            debugger;
            if(isPaint){
                if (freeDrawingType === 'brush') {
                    context.globalCompositeOperation = 'source-over';
                }
                if (freeDrawingType === 'eraser') {
                    context.globalCompositeOperation = 'destination-out';
                }
                context.beginPath();
                context.moveTo(lastPointerPosition.x, lastPointerPosition.y);
                var newPosition = stage.getPointerPosition();

                context.lineTo(newPosition.x, newPosition.y);
                context.stroke();
                debugger;
                lastPointerPosition = newPosition;
                context.strokeShape(this);

            }
        }
    });
    freeHandDrawingLayer.add(freeDraw);
    // now we need to bind some events
    // we need to start drawing on mousedown
    // and stop drawing on mouseup
    selectionBoxBackground.on('mousedown', function() {
        if(isFreeDrawingMode){
            isPaint = true;
            lastPointerPosition = stage.getPointerPosition();
            stage.draw();
        }
    });

    selectionBoxBackground.on('mouseup', function() {
        if(isFreeDrawingMode){
            isPaint = false;
        }
    });

    // and core function - drawing
    selectionBoxBackground.on('mousemove', function() {
            if (!isPaint) {
                return;
            }      
            freeHandDrawingLayer.draw();
    });
}
于 2016-04-18T12:50:41.107 に答える
0

プレーンな JavaScript では、これは非常に簡単です。

まず、キャンバスと描画コンテキストを準備します。

var context=document.getElementById("your_canvas_id").getContext("2d");
var image=document.getElementById("your_image_id");

次に、画像をコンテキストに描画します。

context.drawImage(image,0,0,image.width,image.height,0,0,image.width,image.height);

ここで、画像の一部を消去したい場合は、キャンバス上に描画するだけです:

var x=y=radius=10;// Circle coordinates and radius.

context.fillStyle="#ffffff";// Your eraser color (not transparent)
context.beginPath();
context.arc(x,y,radius,0,Math.PI*2);
context.fill();

ただし、これは消去をシミュレートするだけです。後で消去したものを透明にしたい場合は、 を調べるかもしれませんがcontext.clearRect、円でそれを行う方法がわかりません。

于 2015-02-10T18:08:20.957 に答える