【问题标题】:HTML5 Canvas - How to Draw a line over an image background?HTML5 Canvas - 如何在图像背景上画一条线?
【发布时间】:2012-05-24 07:39:26
【问题描述】:

我正在尝试在图像背景上画一条线 - 在 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();
}

【问题讨论】:

    标签: javascript html animation canvas html5-canvas


    【解决方案1】:

    完全未经测试的代码,但你尝试过这样的事情吗?

    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);
    

    【讨论】:

    • 最后一行是否应该是drawlines(canvas, context, drawlines(canvas,context)); ?
    • 不,因为在这种情况下,您将调用方法“drawlines”,然后使用其返回值作为参数。
    【解决方案2】:

    为了提高效率,假设您要对这条或多条线进行多次重绘,请将画布的 CSS background-image 设置为您的图像。

    <canvas style="background-image:url('images/main_timerand3papers.png');"></canvas>
    

    【讨论】:

    • 谢谢西蒙。但我还需要对背景进行一些动态更改。因此我没有使用 CSS 属性。
    【解决方案3】:

    将您的图像 onload 更改为以下内容:

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

    然后确保删除之前对drawLines 的调用。

    此解决方案的重要内容是 onload 函数将在未来某个时间执行,而 drawLines 函数将立即执行。您必须始终小心构建回调的方式,尤其是在嵌套它们时。

    【讨论】:

    • 这个答案值得更多的支持,因为它有解释
    【解决方案4】:

    或者你可以试试这个:

    drawbackground(canvas, context);
    context.globalCompositeOperation = 'destination-atop';
    drawlines(canvas, context);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2011-09-28
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多