canvas 刮刮乐

今天我们来模拟刮刮乐效果

既然是使用Canvas来完成刮刮乐的效果,那么我们先来创建一个Canvas标签,并给它赋予一个边框,以便于我们查看画布位置及大小。

html
<img src="df.jpg"/>
<canvas id="mycanvas" width="200" height="200">
    你的浏览器不支持canvas
</canvas>
css
*{
    margin: 0;
    padding: 0;
}
img{
    position: relative;
    margin: 0;
    border:1px solid #000000;
}
canvas{
    border: 1px solid #000000;
    position: absolute;
    top:0;
    left: 0;
}
js
var canvas = document.getElementById("mycanvas");
        var context = canvas.getContext("2d");
        
        //目标图
        context.beginPath();
        context.fillStyle="gainsboro";
        context.fillRect(0,0,200,200);
        //只显示目标图,不显示源图
        context.globalCompositeOperation="destination-out"
        

源图的绘制,隐藏了绘制的源图,只显示目标图,显示底层图片,canvas画布是透明的

//源图
        canvas.onmousedown = function(ev){
            var ev = window.event||ev;
            var x = ev.clientX - canvas.offsetLeft;
            var y = ev.clientY - canvas.offsetTop;
            context.beginPath();
            context.moveTo(x,y);
            canvas.onmousemove = function(ev){
                var ev = window.event||ev;
                var xx = ev.clientX - canvas.offsetLeft;
                var yy = ev.clientY - canvas.offsetTop;
                context.lineTo(xx,yy);
                context.strokeStyle = "white";
                context.lineWidth=20;
                context.stroke();
                
                
            }
        }
        document.onmouseup = function(){
            canvas.onmousemove = null;
        }

源图的绘制,隐藏了绘制的源图,只显示目标图,由于隐藏了源图,所以源图部分的透明度为0;因此我们可以根据这个特性,设置当源图的像素点,达到目标图一般时,清空画布

//源图
        var isF = true;
        canvas.onmousedown = function(ev){

            var ev = window.event||ev;
            var x = ev.clientX - canvas.offsetLeft;
            var y = ev.clientY - canvas.offsetTop;
            if(isF){
                context.beginPath();
                isF = false;
            }
            
            context.moveTo(x,y);
            canvas.onmousemove = function(ev){
                var ev = window.event||ev;
                var xx = ev.clientX - canvas.offsetLeft;
                var yy = ev.clientY - canvas.offsetTop;
                context.lineTo(xx,yy);
                context.strokeStyle = "white";
                context.lineWidth=20;
                context.stroke();
                var imgData = context.getImageData(0,0,canvas.width,canvas.height);
                var count =0;
                for(var i=0;i<imgData.data.length;i+=4){
                    var a = imgData.data[i+3];
                    if(a==0){
                        count++;
                    }
                }
                
                if(imgData.data.length/count<=8){
                    for(var i=0;i<imgData.data.length;i+=4){
                     imgData.data[i+3]=0;
                    }
                    //清空画布
//                  context.clearRect(0,0,canvas.width,canvas.height);
                    //清空画布(不推荐)
//                  canvas.width = canvas.width;
                    //重画源图
//                  context.beginPath();
//                  context.fillRect(0,0,canvas.width,canvas.height);
                }
                context.putImageData(imgData,0,0)
                
            }
        }
        document.onmouseup = function(){
            canvas.onmousemove = null;
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容