18

HTML5 Canvas で、画像の背景の上に線を引こうとしています。ただし、常に線は画像の後ろに描かれます。実際には、関数の呼び出し方法に関係なく、最初に線が描かれ、次に絵が描かれます。

線を画像の上部に移動するにはどうすればよいですか?

var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
            context.clearRect(0, 0, canvas.width, canvas.height);
drawbackground(canvas, context); 
drawlines(canvas, context); 


function drawbackground(canvas, context){

    var imagePaper = new Image();


        imagePaper.onload = function(){


            context.drawImage(imagePaper,100, 20, 500,500);
        };

      imagePaper.src = "images/main_timerand3papers.png";
}



function drawlines(canvas, context){


            context.beginPath();
            context.moveTo(188, 130);
            context.bezierCurveTo(140, 10, 388, 10, 388, 170);
            context.lineWidth = 10;
            // line color
            context.strokeStyle = "black";
            context.stroke();
}
4

4 に答える 4

20

完全にテストされていないコードですが、このようなことを試しましたか?

function drawbackground(canvas, context, onload){

    var imagePaper = new Image();


        imagePaper.onload = function(){


            context.drawImage(imagePaper,100, 20, 500,500);
            onload(canvas, context);
        };

      imagePaper.src = "images/main_timerand3papers.png";
}

そして、このようにメソッドを呼び出します...

 drawbackground(canvas, context, drawlines);
于 2012-05-16T17:38:36.547 に答える
7

より効率的にするには、この行または複数の行を複数回再描画することを想定してbackground-image、キャンバスの CSS を画像に設定します。

<canvas style="background-image:url('images/main_timerand3papers.png');"></canvas>
于 2012-05-16T18:47:32.947 に答える
6

イメージのオンロードを次のように変更します。

imagePaper.onload = function () {
    context.drawImage( imagePaper, 100, 20, 500, 500 );
    drawLines( canvas, context );
};

次に、以前の への呼び出しを必ず削除してくださいdrawLines

このソリューションの重要なonloadポイントは、drawLines 関数がすぐに実行されるのに対し、関数は将来いつか実行されるということです。コールバックをネストする場合は特に、コールバックの構造に常に注意する必要があります。

于 2012-05-16T17:46:29.253 に答える
4

または、これを試すことができます:

drawbackground(canvas, context);
context.globalCompositeOperation = 'destination-atop';
drawlines(canvas, context);
于 2013-02-26T08:54:32.677 に答える