canvas 橡皮擦效果制作

擦除一定数量后全部消失的有用 imageData 方法的 我把代码贴在最下面

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>

        <style type="text/css">
            body{
                overflow: hidden;
            }
            #canvas{
                display: block;
                margin: 0 auto;
                border: 2px solid #008000;
                background: url(img2.jpg) no-repeat;
                background-size: cover;
            }
            *{margin: 0;padding: 0;}
        </style>
    </head>
    <body>

        <canvas id="canvas" width="800" height="400"></canvas>

    </body>

    <script type="text/javascript">

        var cvs = document.getElementById(‘canvas‘);
        var ctx = cvs.getContext(‘2d‘);

        cvs.width = window.innerWidth;
        cvs.height = window.innerHeight;

        var cvsWidth = cvs.width;
        var cvsHeight = cvs.height;
        var iNow = false;
        var r = 30;
        var num = 0;
        var img =new Image()
        img.src="img1.jpg"        

        var hastouch = "ontouchstart" in window?true:false,
            tapstart = hastouch?"touchstart":"mousedown",
            tapmove = hastouch?"touchmove":"mousemove",
            tapend = hastouch?"touchend":"mouseup";

        img.onload = function(){
            bottomImg();
            clickDraw();
        }
        function bottomImg(){
            ctx.drawImage(img,0,0,cvsWidth,cvsHeight)
        }
        function clickDraw(){
            cvs.addEventListener(tapstart,function(e){

                e.preventDefault();  

                x1 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft;
                y1 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop;  

                ctx.lineCap = "round";  //设置线条两端为圆弧
                ctx.lineJoin = "round";  //设置线条转折为圆弧
                ctx.lineWidth = r*2;  
                ctx.globalCompositeOperation = "destination-out";  

                ctx.save();
                ctx.beginPath()
                ctx.arc(x1,y1,1,0,2*Math.PI);
                ctx.fill();
                ctx.restore();                  

                iNow = true;
                cvs.addEventListener(tapmove,function(e){
                    e.preventDefault()
                    if( iNow ){
                        var lx = hastouch?e.targetTouches[0].pageX:e.clientX-cvs.offsetLeft;
                        var ly = hastouch?e.targetTouches[0].pageY:e.clientY-cvs.offsetTop;
                        round(lx,ly)
                        num++
                        console.log(num);
                        num>500?ctx.clearRect(0,0,cvsWidth,cvsHeight):‘‘
                    }
                })
            })
            cvs.addEventListener(tapend,function(){
                iNow = false;
            })
        }
        function round(ex,ey){
            x2 = ex
            y2 = ey

            ctx.save();
            ctx.moveTo(x1,y1);
            ctx.lineTo(x2,y2);
            ctx.stroke();
            ctx.restore()  

            x1 = x2;
            y1 = y2;
        }

    </script>
</html>

以下是使用getImageData方式消除剩余部分

//通过修改globalCompositeOperation来达到擦除的效果
function tapClip(){
    var hastouch = "ontouchstart" in window?true:false,
        tapstart = hastouch?"touchstart":"mousedown",
        tapmove = hastouch?"touchmove":"mousemove",
        tapend = hastouch?"touchend":"mouseup";

    canvas.addEventListener(tapstart , function(e){
     clearTimeout(timeout)
        e.preventDefault();

        x1 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft;
        y1 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop;

        ctx.lineCap = "round";  //设置线条两端为圆弧
        ctx.lineJoin = "round";  //设置线条转折为圆弧
        ctx.lineWidth = a*2;  
        ctx.globalCompositeOperation = "destination-out";

        ctx.save();
        ctx.beginPath()
        ctx.arc(x1,y1,1,0,2*Math.PI);
        ctx.fill();
        ctx.restore();

        canvas.addEventListener(tapmove , tapmoveHandler);
        canvas.addEventListener(tapend , function(){
            canvas.removeEventListener(tapmove , tapmoveHandler);

       timeout = setTimeout(function(){
            var imgData = ctx.getImageData(0,0,canvas.width,canvas.height);
            var dd = 0;
            for(var x=0;x<imgData.width;x+=30){
                for(var y=0;y<imgData.height;y+=30){
                    var i = (y*imgData.width + x)*4;
                    if(imgData.data[i+3] > 0){
                        dd++
                    }
                }
            }
            if(dd/(imgData.width*imgData.height/900)<0.4){
                canvas.className = "noOp";
            }
       },100)
        });
        function tapmoveHandler(e){
            e.preventDefault()
            x2 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft;
            y2 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop;

            ctx.save();
            ctx.moveTo(x1,y1);
            ctx.lineTo(x2,y2);
            ctx.stroke();
            ctx.restore()

            x1 = x2;
            y1 = y2;
        }
    })
}
时间: 2024-08-29 10:16:46

canvas 橡皮擦效果制作的相关文章

2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等

1.字符串去重,html模板取值 2.javascript正则表达式之$1...$9 3.jquery插件 4.返回上一页并刷新 解决方法: <a href ="javascript:location.href=document.referrer;"> 5.用webstorm写的手机网站 怎样能用手机预览呢? 解决方法:布署到wamp,xamp,iis上,然后用浏览器生成二维码,扫一扫就可以打开.假如是javaweb项目,挂上tomcat手机直接访问你机子的ip. 6.比例

Canvas 橡皮擦效果

引子 解决了第一个问题图像灰度处理之后,接着就是做擦除的效果. Origin My GitHub 思路 一开始想到 Canvas 的画布可以相互覆盖的特性,彩色原图作为背景,灰度图渲染到 Canvas 画布上,然后手指滑动的时候,把接触的部分清除掉,就显示出了背景图.关键的部分是怎么清除画布上已有图像,查询资料发现有两种方式: 使用 clearRect 方法,会把指定范围所有像素变成透明,并擦除之前绘制的所有内容. 使用 globalCompositeOperation 属性,该属性设置在绘制新

Unity 实现橡皮擦效果

我所实现的橡皮擦效果是设置图片某点的像素的透明度为0,来简单实现擦除效果的: 下面是效果 首先需要注意两点:1:设置 Main Camera 的 projection 属性为Orthographic 2:设置Canvas 的Render Mode 为 Screen Space - Camera 然后找一张图片,导入Unity 中并修改它的读写权限,创建Raw Imager 这样启动之后就可以测试效果了. 附上代码:(代码中有解释) 1 using AYUI.UIFrame; 2 using DG

HTML5 Canvas动画效果实现原理

在线演示 使用HTML5画布可以帮助我们高速实现简单的动画效果.基本原理例如以下: 每隔一定时间绘制图形而且清除图形,用来模拟出一个动画过程,能够使用context.clearRect(0, 0, x, y)方法来刷新须要绘制的图形 首先是绘制图形的方法,例如以下: function myAnimation() { ctx.clearRect(0, 0, canvas_size_x, canvas_size_y); if (x_icon < 0 || x_icon > canvas_size_

Cocos2dx 实现擦除即橡皮擦效果的实现

Cocos2dx实现橡皮擦效果的实现 DionysosLai([email protected])  2014/8/25 之前项目在做一个绘本游戏,要求实现擦除效果,具体效果可以参考绘本<我是一只暴龙>,当时由于项目比较紧,是直接拿网上代码来用(感谢仁兄Zrong的入门之引,具体博文,详见地址,http://zengrong.net/post/2067.htm).当时,没有对其做一些具体优化工作,一些原理,也是似懂非懂.今天,在工作之余,重写了代码,并从始至末将知识点理清楚,务必要求自己能够搞

模仿京东顶部搜索条效果制作的一个小demo

最近模仿京东顶部搜索条效果制作的一个小demo,特贴到这里,今后如果有用到可以参考一下,代码如下 1 #define kScreenWidth [UIScreen mainScreen].bounds.size.width 2 #define kScreenHeight [UIScreen mainScreen].bounds.size.height 3 4 #import "mainViewController.h" 5 6 @interface mainViewController

jquery图片放大镜效果制作变焦镜头图片放大查看

jquery图片放大镜效果制作变焦镜头图片放大查看 http://www.17sucai.com/pins/demoshow/8511

ps雨滴效果制作

雨滴效果制作 尽量选择比较暗或者有人打伞的照片,方便制作雨天的效果 新建图层,设置前景色为黑色,并填充新建的图层为黑色 选择滤镜->杂色->添加杂色,数量设置为150左右(设置得越大后面的效果会越像雪),勾选单色,分布方式无所谓,点击确定 矩形选框工具框选一块,Ctrl+J复制一层(如果在前面新建的图层上做雨滴,就过于密集,这时可以删除上一个图层) Ctrl+T自由变换,将刚才复制的图层放大到盖住图片 将混合模式改为滤色 Ctrl+L,调出色阶,扩大黑色区(将左边的滑块向右调),让白色区越来越

Unity UGUI Canvas 使用Slider制作角色血条

最近课程实训选修Unity,讲解的是Unity官方案例--SpaceShoot,培训无聊,便想着给游戏角色制作一下血条,以此增加游戏的可玩性. Unity版本:5.4.1 案例模版:太空射击 原文作者:茄阁云云 原文连接:http://www.cnblogs.com/vmoor2016/p/6044941.html 把一个大象装进冰箱里需要三步:①把冰箱门打开:②把大象塞冰箱里:③关上冰箱门. 那么制作一个角色的血条需要几部呢?在这里也划分为三步:①制作血条:②摆放血条:③操作血条. 下面就来给