Detailed explanation of how to use JS to achieve the effect of PS eraser scratch card in canvas

Detailed explanation of how to use JS to achieve the effect of PS eraser scratch card in canvas

Effect demonstration:

Main JS code implementation

 <div class="box" id="bb">
        <canvas id="cas" width="1366" height="651"></canvas>
    </div>
 
    <script type="text/javascript" charset="utf-8">
        var canvas = document.getElementById("cas"),
            ctx = canvas.getContext("2d");
        var x1, y1, a = 30,
            timeout, totimes = 100,
            jiange = 30;
        canvas.width = document.getElementById("bb").clientWidth;
        canvas.height = document.getElementById("bb").clientHeight;
        var img = new Image();
        img.src = "sha.jpg";
        img.onload = function() {
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
            //ctx.fillRect(0,0,canvas.width,canvas)
            tapClip()
        }
 
        //Achieve the erasing effect by modifying globalCompositeOperation function tapClip() {
            var hastouch = "ontouchstart" in window ? true : false,
                tapstart = hastouch ? "touchstart" : "mousedown",
                tapmove = hastouch ? "touchmove" : "mousemove",
                tapend = hastouch ? "touchend" : "mouseup";
 
            ctx.lineCap = "round";
            ctx.lineJoin = "round";
            ctx.lineWidth = a * 2;
            ctx.globalCompositeOperation = "destination-out";
 
            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.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 += jiange) {
                            for (var y = 0; y < imgData.height; y += jiange) {
                                var i = (y * imgData.width + x) * 4;
                                if (imgData.data[i + 3] > 0) {
                                    dd++
                                }
                            }
                        }
                        if (dd / (imgData.width * imgData.height / (jiange * jiange)) < 0.4) {
                            canvas.className = "noOp";
                        }
                    }, totimes)
                });
 
           
                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 += jiange) {
                            for (var y = 0; y < imgData.height; y += jiange) {
                                var i = (y * imgData.width + x) * 4;
                                if (imgData.data[i + 3] > 0) {
                                    dd++
                                }
                            }
                        }
 
                    }, totimes)
 
                });
 
            
        }
    </script>
    <script type="text/javascript">
        window.setTimeout('CountDown()', 100);
        // End
    </script>

The above is the detailed content of how to use JS to achieve the effect of canvas imitating PS eraser scratch card. For more information about JS, please pay attention to other related articles on 123WORDPRESS.COM!

You may also be interested in:
  • js canvas realizes eraser effect
  • JavaScript canvas to achieve scratch lottery example

<<:  Analysis of the problem of deploying vue project and configuring proxy in Nginx

>>:  Use CSS to implement special logos or graphics

Recommend

Solution to garbled display of Linux SecureCRT

Let's take a look at the situation where Secu...

3 functions of toString method in js

Table of contents 1. Three functions of toString ...

React Native JSI implements sample code for RN and native communication

Table of contents What is JSI What is different a...

Vue implements a simple magnifying glass effect

This article example shares the specific code of ...

How to prevent hyperlink redirection using JavaScript (multiple ways of writing)

Through JavaScript, we can prevent hyperlinks fro...

Detailed explanation of CSS style sheets and format layout

Style Sheets CSS (Cascading Style Sheets) is used...

How MLSQL Stack makes stream debugging easier

Preface A classmate is investigating MLSQL Stack&...

Explanation of the usage of replace and replace into in MySQL

MySQL replace and replace into are both frequentl...

Detailed explanation of nginx's default_server definition and matching rules

The default_server directive of nginx can define ...

Detailed explanation of type protection in TypeScript

Table of contents Overview Type Assertions in syn...

CSS to achieve the sticky effect of two balls intersecting sample code

This is an effect created purely using CSS. To pu...

Detailed explanation of the use of Linux time command

1. Command Introduction time is used to count the...

Detailed explanation of Nginx version smooth upgrade solution

Table of contents background: Nginx smooth upgrad...

Html Select uses the selected attribute to set the default selection

Adding the attribute selected = "selected&quo...