老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

canvas中globalCompositeOperation屬性的示例分析

這篇文章給大家分享的是有關canvas中globalCompositeOperation屬性的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

網站建設哪家好,找創新互聯!專注于網頁設計、網站建設、微信開發、微信小程序定制開發、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了陜西免費建站歡迎大家使用!

說明

最早知道 canvas 的 globalCompositeOperation 屬性,是在需要實現一個刮刮卡效果的時候,當時也就是網上找到刮刮卡的效果趕緊完成任務就完了,這次又學習一次,希望能加深理解吧。

先來看下 canvas 的 globalCompositeOperation屬性,具體是干什么的。

定義

globalCompositeOperation 屬性設置或返回如何將一個源(新的)圖像繪制到目標(已有)的圖像上。
源圖像 = 您打算放置到畫布上的繪圖。
目標圖像 = 您已經放置在畫布上的繪圖。

這個屬性用來設置要在繪制新形狀時應用的合成操作的類型,比如在一個藍色的矩形上畫一個紅色的圓形,是紅色在上顯示,還是藍色在上顯示,重疊的部分顯示還是不顯示,不重疊的部分又怎么顯示,等一些情況,在面對這些情況的時候,就是 globalCompositeOperation 屬性起作用的時候了。
在取默認值的情況下,都是顯示的,新畫的圖形會覆蓋原來的圖形。

用法

默認值: source-over
語法: context.globalCompositeOperation="source-in";

表格中的藍色矩形為目標圖像,紅色圓形為源圖像。

屬性值描述效果
source-over默認。在目標圖像上顯示源圖像。canvas中globalCompositeOperation屬性的示例分析
source-atop在目標圖像頂部顯示源圖像。源圖像位于目標圖像之外的部分是不可見的。canvas中globalCompositeOperation屬性的示例分析
source-in在目標圖像中顯示源圖像。只有目標圖像內的源圖像部分會顯示,目標圖像是透明的。canvas中globalCompositeOperation屬性的示例分析
source-out在目標圖像之外顯示源圖像。只會顯示目標圖像之外源圖像部分,目標圖像是透明的。canvas中globalCompositeOperation屬性的示例分析
destination-over在源圖像上方顯示目標圖像。canvas中globalCompositeOperation屬性的示例分析
destination-atop在源圖像頂部顯示目標圖像。源圖像之外的目標圖像部分不會被顯示。canvas中globalCompositeOperation屬性的示例分析
destination-in在源圖像中顯示目標圖像。只有源圖像內的目標圖像部分會被顯示,源圖像是透明的。canvas中globalCompositeOperation屬性的示例分析
destination-out在源圖像外顯示目標圖像。只有源圖像外的目標圖像部分會被顯示,源圖像是透明的。canvas中globalCompositeOperation屬性的示例分析
lighter顯示源圖像 + 目標圖像。canvas中globalCompositeOperation屬性的示例分析
copy顯示源圖像。忽略目標圖像。canvas中globalCompositeOperation屬性的示例分析
xor使用異或操作對源圖像與目標圖像進行組合。canvas中globalCompositeOperation屬性的示例分析

好的,下來實現一個水滴擴散的效果:

https://codepen.io/FEWY/pen/oPxbmj

效果圖

canvas中globalCompositeOperation屬性的示例分析

實現思路

在一個 canvas 上先畫出黑白色的圖片,然后設置背景是一張彩色的圖片,鼠標點擊時,設置 canvas 的 globalCompositeOperation 屬性值為 destination-out,根據鼠標在 canvas 中的 坐標,用一個不規則的圖形逐漸增大,來擦除掉黑白色的圖片,就可以慢慢顯示彩色的背景了。

也就是說我們需要三張圖片

黑白的圖片

canvas中globalCompositeOperation屬性的示例分析

彩色的圖片

canvas中globalCompositeOperation屬性的示例分析

不規則形狀的圖片

canvas中globalCompositeOperation屬性的示例分析

代碼





    
    



    

     
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");

        // 保存圖片路徑的數組
        var urlArr = ["https://www.kkkk1000.com/images/globalCompositeOperation/bg2.png", "https://www.kkkk1000.com/images/globalCompositeOperation/clear.png"];
        // imgArr 保存加載后的圖片的數組,imgArr中保存的是真實的圖片
        // loadImg 函數用來加載 urlArr 中所有的圖片
        // 并返回一個保存所有圖片的數組
        var imgArr = loadImg(urlArr);
        // flag 用來限制 點擊事件,一張圖片只會產生一次效果
        var flag = false;
 

        function loadImg(urlArr) {
            var index = 0;
            var res = [];
            // 每次給 load 函數傳入一個圖片路徑,來加載圖片
            load(urlArr[index]);
            function load(url) {
                // 如果 index 等于 urlArr.length,
                // 表示加載完 全部圖片了,就結束 load函數
                if (index == urlArr.length) {
                    // 加載完全部圖片,調用 init 函數
                    init();
                    return;
                }

                var img = new Image();
                img.src = url;
                // 不管當前圖片是否加載成功,都要加載下一張圖片
                img.onload = next;
                img.onerror = function () {
                    console.log(res[index] + "加載失敗");
                    next();
                }
                // next 用來加載下一張圖片
                function next() {
                    // 把加載后的圖片,保存到 res 中
                    res[index] = img;
                    load(urlArr[++index])
                }
            }
            // 最后返回保存所有真實圖片的數組
            return res;
        }

        function init() {
            // 先在canvas上畫黑白的圖片,然后再設置背景是彩色的圖片
            // 避免先顯示出彩色圖片,再顯示出黑白的圖片
            context.globalCompositeOperation = "source-over";
            context.drawImage(imgArr[0], 0, 0, 400, 250);
            canvas.style.background = 'url(https://www.kkkk1000.com/images/globalCompositeOperation/bg.jpg)';
            canvas.style.backgroundSize = "100% 100%";

            // flag 是 true 時,鼠標點擊才有水滴擴散的效果
            flag = true;
            // canvas 綁定點擊事件,點擊時產生水滴擴散效果
            canvas.onclick =  diffusion;
        }

        // width 表示 不規則形狀的圖片的尺寸
        var width = 0;
        // speed 表示擴散效果的速度
        var speed = 8;
        // diffusion 函數根據鼠標坐標,產生效果
        function  diffusion (e) {
            if (flag) {
                flag = false;
                context.globalCompositeOperation = "destination-out";
                window.requestAnimationFrame(draw);
                // 根據鼠標坐標,畫擴散效果
                function draw() {
                    // 這里不一定需要是 1800 ,但必須是一個足夠大的數,可以擴散出整張背景圖
                    if (width > 1800) {
                        flag = true;
                        return;
                    }
                    width += speed;
                    // 獲取鼠標相對于 canvas 的坐標
                    var x = e.layerX;
                    var y = e.layerY;

                    // 畫不規則形狀的圖片,逐漸增大圖片尺寸
                    context.drawImage(imgArr[1], x - (width / 2), y - (width / 2), width, width);
                    window.requestAnimationFrame(draw);
                }
            }
        }
    


我們繼續來實現一個刮刮卡的效果

效果圖

canvas中globalCompositeOperation屬性的示例分析

刮刮卡效果實現的思路:

一個 canvas 上先畫一層灰色,然后設置canvas的背景圖,設置 canvas 的 globalCompositeOperation屬性值為 destination-out,點擊并移動時,根據移動點的坐標,擦除掉灰色,當擦掉一部分時,再自動擦除掉全部灰色,顯示出背景來。

刮刮卡的效果和水滴擴散的效果,在開始的時候幾乎是一樣的,不過水滴擴散效果,用的是一張不規則形狀的圖片來清除黑白圖片,而刮刮卡效果,是通過畫線的方式,線比較粗而已,來清除上面的灰色。
主要的不同是,刮刮卡效果最后需要自動擦除掉全部灰色,這里有兩種方式。

第一種

使用 canvas 的 getImageData 方法,來獲取 canvas 上的像素信息,這個方法返回的對象的 data 屬性是一個一維數組,包含以 RGBA 順序的數據,數據使用 0 至 255(包含)的整數表示,詳細的可以看看 canvas 的像素操作。
用這個方法來判斷有多少已經擦除掉了,也就是通過一個變量來記錄有多少像素的RGBA的值是0,當變量的值超過某一個值時,就清除全部灰色。

代碼在這里:

https://codepen.io/FEWY/pen/BOjmyg

第二種

就直接看移動了多少,鼠標移動時,會有一個變量進行自增運算,當這個變量,超過一定值時,就擦除全部灰色。

代碼在這里

https://codepen.io/FEWY/pen/eLJeNv

注意:
第一種方式使用 getImageData 存在跨域問題,不過因為這個效果中,沒有在canvas上畫圖片,而是設置canvas的 background 為一張圖片,所以這個還沒有影響,但是如果canvas上畫了其他圖片,就可能需要處理跨域的問題了。
使用 getImageData 能獲取到 canvas 上的像素信息,就可以根據刮刮卡上灰色的面積,決定擦除全部灰色的時機,更加靈活。

第二種方式,雖然不存在跨域的問題,但是,不能很好的根據刮刮卡上灰色的面積,控制最后擦除全部灰色的時機。

感謝各位的閱讀!關于“canvas中globalCompositeOperation屬性的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


網頁名稱:canvas中globalCompositeOperation屬性的示例分析
網頁鏈接:http://www.xueling.net.cn/article/jsjisc.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲大片精品永久免费 | 好硬啊进得太深了A片无码公司 | 亚洲国产欧美日韩另类 | 国产99久久久精品 | 国产裸体美女永久免费无遮挡 | 99在线免费观看 | 日韩精品999 | 一级片免费在线观看 | 国产精品一区二区三区www | 出租屋嫖妓大龄熟妇露脸在线播放 | 欧亚精品卡一卡二卡三 | 真实乱子伦露脸自拍 | 91女女互慰吃奶在线 | 色哟哟一区二区 | XXXX漂亮少妇XXXXHD | 亚洲国产成人久久 | 在野外被三个男人躁爽白浆视频 | 永久免费视频国产 | 中文久久 | 中文字幕超碰在线 | 日韩日本欧美亚洲 | 337P日本欧洲亚洲大胆在线 | www.亚洲天堂 | 久久婷婷五月综合色精品 | 国产麻豆精品传媒AV国产婷婷 | 国产精品一区二区三区四区在线观看 | 久久久久爽人综合网站 | 日韩在线日韩 | 亚洲av片不卡无码av | 天天透天天狠天天爱综合97 | 欧美在线视频一区 | 青青草无码免费一二三区 | 国产欧美日韩一区二区三区在线 | 国产日韩AV无码免费一区二区 | 黑人女人性较视频免费视频 | 伦理片aa | 久久丫精品国产亚洲av | 亚洲国产欧美在线 | 一区二区在线精品 | 日韩av成人在线 | 男人操女人免费视频网站 |