婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > html5利用canvas實現顏色容差摳圖功能

html5利用canvas實現顏色容差摳圖功能

熱門標簽:惡搞電話機器人 黃石ai電銷機器人呼叫中心 如何查看地圖標注 欣鼎電銷機器人 效果 電話機器人技術 高德地圖標注商戶怎么標 智能電銷機器人被禁用了么 地圖標注軟件打印出來 ok電銷機器人

利用canvas的getImageData,我們可以獲取到一張圖片每一個像素的信息,而通過對每一個像素信息的對比,我們就可以找到需要消去的像素點。比如下面這一張圖片,如果我們想要扣去白色部分(粉色是body的背景顏色)。

 

let canvas = document.querySelector('#canvas');
let context = canvas.getContext('2d');
let img = document.createElement('img');
img.src = './head2.png';
img.onload = function () {
    canvas.height = img.height;
    canvas.width = img.width;
    context.drawImage(img, 0, 0);
    cutout(canvas, [255, 255, 255], 0.2); // 對白色進行摳除,容差為0.2
}
function cutout(canvas, color, range = 0) {
    let context = canvas.getContext('2d');
    let imageInfo = context.getImageData(0, 0, canvas.width, canvas.height);
    // pixiArr是一個數組,每四個數組元素代表一個像素點,這四個數組元素分別對應一個像素的r,g,b,a值。
    let pixiArr = imageInfo.data;
    for (let i = 0; i < pixiArr.length; i += 4) {
    // 匹配到目標像素就將目標像素的alpha設為0
        if (testColor([pixiArr[i], pixiArr[i + 1], pixiArr[i + 2]], color, range)) pixiArr[i + 3] = 0;
    }
    context.putImageData(imageInfo, 0, 0);
}
function testColor(current, target, range) {
    for (let i = 0; i < 3; i++) {
        if (!((1 - range) * target[i] <= current[i] && (1 + range) * target[i] >= current[i])) return false;
    }
    return true;
}

 

testColor(current, target, range) 方法三個參數分別為 待檢測像素點的rgb數組 、 目標像素點的rgb數組 和 容差范圍 ,這里的容差只是簡單用r、g、b的值分別乘以(1 + range)和(1 - range)來計算并對比,不同的容差參數會得到不同的效果↓

range = 0.095

 

range = 0.1

 

range = 0.2

 

當然對于底色是標準的純色的圖片就不需要容差了。

邊界處理

但是有時候我們希望有一個邊界,讓摳圖操作不對邊界內部的像素造成影響。比如上面的圖片,我們希望不會對人物頭像內部的像素造成影響。 如果我們一行一行來看,是不是只要在碰到不是邊界像素的時候停止操作,就可以達到效果了呢?

我們對每一行分別進行掃描,定義一個左指針 left 指向這一行的第一個像素,定義一個右指針 right 指向這一行的最后一個像素,并用一個 leftF 標識左邊是否碰到邊界,一個 rightF 標識右邊是否碰到邊界,當沒碰到邊界時指針就一直向內收縮,直到兩個指針都碰到邊界或者左右指針重合就跳到下一行,直到所有行都掃描完畢。

function cutout(canvas, color, range = 0) {
    let context = canvas.getContext('2d');
    let imageInfo = context.getImageData(0, 0, canvas.width, canvas.height);
    let pixiArr = imageInfo.data;
    for (let row = 0; row < canvas.height; row++) {
        let left = row * 4 * canvas.width; // 指向行首像素
        let right = left + 4 * canvas.width - 1 - 3; // 指向行尾像素
        let leftF = false; // 左指針是否碰到邊界的標識
        let rightF = false; // 右指針是否碰到邊界的標識
        while (!leftF || !rightF) { // 當左右指針都為true,即都碰到邊界時結束
            if (!leftF) {
                if (testColor([pixiArr[left], pixiArr[left + 1], pixiArr[left + 2]], color, range)) {
                    pixiArr[left + 3] = 0; // 此像素的alpha設為0
                    left += 4; // 移到下一個像素
                } else leftF = true; // 碰到邊界
            }
            if (!rightF) {
                if (testColor([pixiArr[right], pixiArr[right + 1], pixiArr[right + 2]], color, range)) {
                    pixiArr[right + 3] = 0;
                    right -= 4;
                } else rightF = true;
            }
            if (left == right) { // 左右指針重合
                leftF = true;
                rightF = true;
            };
        }
    }
    context.putImageData(imageInfo, 0, 0);
}

 

雖然大概完成了我們的需求,但是看一下上面頭發那為啥會多了一塊白色

 

因為我們僅僅只進行了行掃描,當左指針碰到頭發時就會停止掃描,但是頭發弧度里面的就無法被掃描到了,我們還需要進行列掃描,改造一下上面的方法:

function cutout(canvas, color, range = 0) {
    let context = canvas.getContext('2d');
    let imageInfo = context.getImageData(0, 0, canvas.width, canvas.height);
    let pixiArr = imageInfo.data;
    for (let row = 0; row < canvas.height; row++) {
        let left = row * 4 * canvas.width;
        let right = left + 4 * canvas.width - 1 - 3;
        let leftF = false;
        let rightF = false;
        while (!leftF || !rightF) {
            if (!leftF) {
                if (testColor([pixiArr[left], pixiArr[left + 1], pixiArr[left + 2]], color, range)) {
                    pixiArr[left + 3] = 0;
                    left += 4;
                } else leftF = true;
            }
            if (!rightF) {
                if (testColor([pixiArr[right], pixiArr[right + 1], pixiArr[right + 2]], color, range)) {
                    pixiArr[right + 3] = 0;
                    right -= 4;
                } else rightF = true;
            }
            if (left == right) {
                leftF = true;
                rightF = true;
            };
        }
    }
    // 同理進行列掃描
    for (let col = 0; col < canvas.width; col++) {
        let top = col * 4; // 指向列頭
        let bottom = top + (canvas.height - 2) * canvas.width * 4 + canvas.width * 4; // 指向列尾
        let topF = false;
        let bottomF = false;
        while (!topF || !bottomF) {
            if (!topF) {
                if (testColor([pixiArr[top], pixiArr[top + 1], pixiArr[top + 2]], color, range)) {
                    pixiArr[top + 3] = 0;
                    top += canvas.width * 4;
                } else topF = true;
            }
            if (!bottomF) {
                if (testColor([pixiArr[bottom], pixiArr[bottom + 1], pixiArr[bottom + 2]], color, range)) {
                    pixiArr[bottom + 3] = 0;
                    bottom -= canvas.width * 4;
                } else bottomF = true;
            }

            if (top == bottom) {
                topF = true;
                bottomF = true;
            };
        }
    }

    context.putImageData(imageInfo, 0, 0);
}

 

至于top和bottom為啥是那樣計算畫個矩陣圖大概就知道了。

 

處理后↓

 

其實還可以先將 pixiArr 包裝為以一個像素點為單位的矩陣

[
    [{r: 255, g: 255, b: 255, a: 1}, {r: 255, g: 255, b: 255, a: 1}, {r: 255, g: 255, b: 255, a: 1}],
    [{r: 255, g: 255, b: 255, a: 1}, {r: 255, g: 255, b: 255, a: 1}, {r: 255, g: 255, b: 255, a: 1}]
    [{r: 255, g: 255, b: 255, a: 1}, {r: 255, g: 255, b: 255, a: 1}, {r: 255, g: 255, b: 255, a: 1}]
]

處理后計算像素下標也就會更簡單,列掃描時直接先將這個矩陣旋轉,再用行掃描處理一遍就行了。這樣處理pixiArr也有利于進一步對算法進行優化。

上述方法雖然大概完成了摳圖效果,但是這種簡單處理還會有許多情況沒有考慮到。

比如右邊頭發這里是行掃描和列掃描都無法觸碰到的區域↓

 

下面的衣服也因為顏色和底色一樣且沒有邊界在列掃描中被直接抹去了↓

 

最后

對于主體和底色區分度很大的圖片來說,最開始的那種方法就已經夠用了。這篇中我采用的容差和邊界處理算法的優化空間還很大,但是它們是非常容易實現與理解的,這篇權當做一個引子,各位完全可以根據自己的能力繼續去實現邊界與容差算法。

總結

以上所述是小編給大家介紹的html5利用canvas實現顏色容差摳圖功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

標簽:萍鄉 綏化 盤錦 阿壩 聊城 中山 赤峰 金昌

巨人網絡通訊聲明:本文標題《html5利用canvas實現顏色容差摳圖功能》,本文關鍵詞  html5,利用,canvas,實現,顏色,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《html5利用canvas實現顏色容差摳圖功能》相關的同類信息!
  • 本頁收集關于html5利用canvas實現顏色容差摳圖功能的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久久欧美精品sm网站| 欧美日产在线观看| 日本不卡一二三区黄网| 亚洲国产精品久久一线不卡| 亚洲精品免费播放| 亚洲欧美另类综合偷拍| 亚洲视频香蕉人妖| 亚洲精品日韩一| 亚洲一区二区三区精品在线| 性做久久久久久免费观看| 天天色图综合网| 日日夜夜免费精品| 精品亚洲国产成人av制服丝袜| 精品一区二区在线视频| 成人一区二区三区在线观看| 国产一区二区在线看| 黄页视频在线91| 高清在线不卡av| 日韩精品一区二区三区在线观看| 欧美一级理论片| 欧美激情在线一区二区三区| 亚洲老司机在线| 午夜私人影院久久久久| 国精产品一区一区三区mba桃花 | 精品国产区一区| 国产精品久久久久久久久搜平片| 亚洲激情校园春色| 美国十次综合导航| 成人av免费网站| 在线播放视频一区| 国产精品久久久久久亚洲伦| 欧美激情一区二区三区不卡| 亚洲成人你懂的| 日韩在线a电影| 成人精品小蝌蚪| 制服.丝袜.亚洲.另类.中文| 久久九九国产精品| 亚洲成av人影院在线观看网| 国产一区二区三区香蕉| 老司机精品视频一区二区三区| 99国产欧美久久久精品| 欧美成人免费网站| 亚洲精品视频一区| 韩国v欧美v日本v亚洲v| 欧美调教femdomvk| 国产精品日日摸夜夜摸av| 日日骚欧美日韩| 日本大胆欧美人术艺术动态| 成人激情午夜影院| 日韩欧美一区在线观看| 亚洲男同性恋视频| 国产尤物一区二区| 91亚洲午夜精品久久久久久| 精品va天堂亚洲国产| 天天综合色天天| 在线观看亚洲专区| 中文字幕综合网| 亚洲大尺度视频在线观看| 成人高清视频在线| 欧美一级黄色大片| 一区二区欧美国产| 91丨九色丨尤物| 国产色一区二区| 九九**精品视频免费播放| 欧美日韩成人综合| 一区二区三区精品视频在线| 国产凹凸在线观看一区二区| 欧美一级在线观看| 日韩在线观看一区二区| 欧美又粗又大又爽| av动漫一区二区| 国产日韩精品一区二区浪潮av | 国产91精品在线观看| 欧美一区二区播放| 男人的天堂久久精品| 欧美日韩一区二区欧美激情| 亚洲欧美日韩国产成人精品影院| 国产91在线看| 国产精品电影院| 国产精品羞羞答答xxdd| 日本一区二区三区国色天香| 国产精品亚洲人在线观看| 精品国产露脸精彩对白| 欧美日韩电影一区| 日韩精品国产精品| 精品日韩一区二区三区免费视频| 亚洲色图另类专区| 91成人在线精品| 亚洲1区2区3区4区| 91精品综合久久久久久| 欧美aaa在线| 久久先锋影音av| 91亚洲大成网污www| 亚洲欧美视频在线观看| 成人动漫av在线| 国产亚洲欧美在线| 成人精品视频一区二区三区 | 午夜精品免费在线| 欧美无砖砖区免费| 国产精品综合视频| 亚洲第一福利一区| 日本一区二区久久| 日韩欧美激情在线| 欧美日韩一区中文字幕| 成人app在线| 久久精品国产99久久6| 亚洲国产裸拍裸体视频在线观看乱了| www激情久久| 欧美日本国产视频| 99精品欧美一区| 国产黄色成人av| 久久99日本精品| 日韩制服丝袜av| 一区二区欧美国产| 国产精品大尺度| 久久久蜜桃精品| 日韩精品综合一本久道在线视频| 日本乱人伦一区| 成人91在线观看| 懂色av中文字幕一区二区三区| 蜜乳av一区二区三区| 亚洲v精品v日韩v欧美v专区| 亚洲免费观看在线视频| 亚洲欧洲精品一区二区精品久久久| 2020国产精品久久精品美国| 日韩精品综合一本久道在线视频| 欧美一区二区三区啪啪| 欧美一区二区在线免费播放| 69成人精品免费视频| 欧美高清视频一二三区| 91麻豆精品国产自产在线| 欧美另类videos死尸| 欧美无乱码久久久免费午夜一区 | 成人激情文学综合网| 国产主播一区二区| 国内精品视频一区二区三区八戒| 精一区二区三区| 国产酒店精品激情| 国产成人精品三级| 成人免费高清视频在线观看| 成人午夜电影网站| 91在线国产福利| 欧美在线free| 欧美一区二区三区播放老司机| 91精品国产一区二区三区| 日韩一级二级三级精品视频| 欧美videos中文字幕| 久久精品人人做人人爽人人| 国产欧美精品日韩区二区麻豆天美| 中文子幕无线码一区tr| 亚洲精品午夜久久久| 五月天激情小说综合| 久久91精品久久久久久秒播| 国内精品国产成人国产三级粉色| 国产成人精品午夜视频免费| 色综合中文字幕| 91精品国产高清一区二区三区| 久久影院午夜论| 亚洲精品欧美激情| 亚洲欧洲一区二区在线播放| 最新中文字幕一区二区三区 | 精品视频在线免费看| 欧美精品一二三| 国产日韩欧美亚洲| 亚洲综合丝袜美腿| 麻豆91在线观看| av不卡免费电影| 欧美人妖巨大在线| 日本一区二区三区国色天香| 亚洲自拍偷拍网站| 国产一区二区视频在线| 99久久久无码国产精品| 91麻豆精品久久久久蜜臀| 国产欧美精品国产国产专区| 亚洲韩国精品一区| 国产精品一区二区你懂的| 色八戒一区二区三区| 午夜伦理一区二区| 国产精品一线二线三线精华| 欧美在线免费视屏| 国产欧美日韩在线视频| 婷婷成人综合网| 不卡一区二区三区四区| 日韩欧美国产午夜精品| 亚洲女同ⅹxx女同tv| 国产精品12区| 欧美一区二区在线视频| 亚洲精品视频在线观看网站| 国产精品中文有码| 欧美一区2区视频在线观看| 亚洲欧美另类久久久精品| 国产在线精品免费av| 欧美日韩国产精品自在自线| 亚洲欧洲精品一区二区三区| 国内精品在线播放| 欧美一区日韩一区| 亚洲成人免费影院| 99精品久久只有精品| 国产性色一区二区| 琪琪一区二区三区|