溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JS如何實(shí)現(xiàn)canvas仿ps橡皮擦刮卡效果

發(fā)布時(shí)間:2021-11-22 12:27:18 來源:億速云 閱讀:249 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了JS如何實(shí)現(xiàn)canvas仿ps橡皮擦刮卡效果,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    效果演示:

    JS如何實(shí)現(xiàn)canvas仿ps橡皮擦刮卡效果

    主要JS代碼實(shí)現(xiàn)

     <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()
            }
     
            //通過修改globalCompositeOperation來達(dá)到擦除的效果
            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>

    感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JS如何實(shí)現(xiàn)canvas仿ps橡皮擦刮卡效果”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI