Javascript Canvas 清除/重绘

标签 javascript canvas html5-canvas

我试过用谷歌搜索这个问题的答案,但我只是在兜圈子.... 如果我清除矩形(使用 clearRect),则之后图像不会重绘。 但是,如果我不清除图像只是堆叠。 我想让它清除当前图像,然后用新图像绘制。 我错过了什么? 它与图像加载有关吗? 抱歉,如果这是一个重复的问题,我找不到确切的答案 - 我尝试了其他人的建议,但结果很差。

http://jsfiddle.net/bxeuhh4h/

function clear() {
    var canvasTemp = document.getElementById(imgSection);
    var ctxTemp = canvasTemp.getContext("2d");
    ctxTemp.clearRect(0, 0, 500, 500);

}

function fillColorOrPattern(imgSection,currentcolor){
if ((oldcolor !== currentcolor) || (oldxImgToBeFilled !== xImgToBeFilled)){
    clear();
}
imgFill.onload = function () {
imgToBeFilled.onload = function () {
        if ((oldcolor !== currentcolor) || (oldxImgToBeFilled !== xImgToBeFilled)){

        fill(imgSection,currentcolor)

        }
  };
imgToBeFilled.src = xImgToBeFilled;
}
imgFill.src = xImgFill;
}


function fill(imgSection,currentcolor){
canvas = document.getElementById(imgSection);
ctx = canvas.getContext("2d");
ctx.drawImage(imgToBeFilled, 0, 0);
ctx.globalCompositeOperation = "source-atop";
console.log(isItColorOrPattern);
        if (isItColorOrPattern ==   "color"){
            ctx.rect(0, 0, canvas.width, canvas.height);
            console.log("currentcolor: " + currentcolor);
            ctx.fillStyle = getColor(currentcolor);
            console.log(getColor(currentcolor));
            ctx.fill();
        }else{
            var pattern = ctx.createPattern(imgFill, 'repeat');
            console.log("canvas.width: " + canvas.width);
            console.log("xImgFill: " + xImgFill);
            console.log(canvas.getContext);
            ctx.rect(0, 0, canvas.width, canvas.height);
            ctx.fillStyle = pattern;
            ctx.fill();
        }

        ctx.globalAlpha = .10;
        ctx.drawImage(imgToBeFilled, 0, 0);
        ctx.drawImage(imgToBeFilled, 0, 0);
        ctx.drawImage(imgToBeFilled, 0, 0);


    oldcolor = currentcolor;
    oldxImgToBeFilled = xImgToBeFilled;

}

$(window).load(function(){
imgToBeFilled = new Image();
imgFill = new Image();  
fillColorOrPattern(imgSection,currentcolor);
}

最佳答案

您需要添加一个 beginPath()在那里。 rect()将向路径累积矩形,clearRect()不会清除那些。同时重置 comp。 mode 和 alpha,因为它们是粘性的。

你可以避免 beginPath()如果你使用 fillRect()而不是 rect() + fill() (在下面添加示例)为 fillRect()不添加到路径中。

function fill(imgSection,currentcolor){

    // these should really be initialized outside the loop    
    canvas = document.getElementById(imgSection);
    ctx = canvas.getContext("2d");

    // clear canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    // clear path
    ctx.beginPath();

    // use default comp. mode
    ctx.globalCompositeOperation = "source-over";

    // reset alpha
    ctx.globalAlpha = 1;

    ctx.drawImage(imgToBeFilled, 0, 0);
    ctx.globalCompositeOperation = "source-atop";

    if (isItColorOrPattern === "color"){

        // rect() accumulates on path
        ctx.rect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = getColor(currentcolor);
        ctx.fill();

       // instead of rect() + fill() you could have used:
       // fillRect() does not accumulate on path
       // fillRect(0, 0, canvas.width, canvas.height);
    }
    else {
        var pattern = ctx.createPattern(imgFill, 'repeat');
        ctx.rect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = pattern;
        ctx.fill();
    }

    ctx.globalAlpha = .1;
    ctx.drawImage(imgToBeFilled, 0, 0);
    ctx.drawImage(imgToBeFilled, 0, 0);
    ctx.drawImage(imgToBeFilled, 0, 0);

    oldcolor = currentcolor;
    oldxImgToBeFilled = xImgToBeFilled;    
}

关于Javascript Canvas 清除/重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738717/

相关文章:

javascript - 如何获取 Fabric JS 中形状的坐标?

javascript - HTML5 Circle防止拖动到Canvas之外并防止碰撞

javascript - 计算滑动的功率/力量

javascript - 单击时向子元素添加事件/禁用

jquery - 如何在fabricJS中向圆形对象添加文本?

javascript - grunt-karma RangeError 最大错误

canvas - 使用 easeljs/canvas 删除 Shape 对象

javascript - 通过 Three.js 中的 getImageData 像素颜色数据循环创建多个立方体

javascript - 如何将对象作为方法参数传递到 javascript 中而不出现意外的标识符错误

javascript - 如何正确导出Webpack库?