javascript獲取圖片的top N主色值方法詳解
題目要求
找出一個(gè)頁(yè)面中出現(xiàn)次數(shù)最多的標(biāo)簽?。?!
個(gè)人解法:
var eles = document.getElementsByTagName('*');
var rs = [];
for(var i=0; i<eles.length; i++) {
var tag_name = eles[i].tagName.toLowerCase();
if(undefined != tag_name) {
if(inJsonArray(rs, tag_name)) {
addWeight(rs, tag_name);
}else {
rs.push({
tag : tag_name,
weight : 1
})
}
}
}
SortByWeight(rs);
思路:
拿到所有的標(biāo)簽--根據(jù)標(biāo)簽名稱聚類---根據(jù)權(quán)重排序。
如果有更好的方法,歡迎交流。
下面看今天這個(gè)問(wèn)題:
獲取一張圖片的top N主色值,和上面最多標(biāo)簽的問(wèn)題很類似,數(shù)據(jù)大小有區(qū)別,別的都差不多的。
這個(gè)問(wèn)題思路很清晰,第一步,拿到圖片的數(shù)據(jù);第二步,根據(jù)色值進(jìn)行聚類;第三步,對(duì)聚類結(jié)果排序。所以這次就是根據(jù)這個(gè)思路去實(shí)現(xiàn)。
1、數(shù)據(jù)獲取
圖片數(shù)據(jù)獲取使用了canvas的getImageData()方法,能獲取到圖片每個(gè)像素點(diǎn)的rgba數(shù)據(jù)。
var imgdatas=context.getImageData(0,0,150,150);//獲取當(dāng)前canvas數(shù)據(jù)
var imgdata = imgdatas.data;//獲取rgba數(shù)據(jù)
var i = 0, len = imgdata.length;
var arr = [];
//將圖片rgba數(shù)據(jù)push到新數(shù)組中
for(i ; i<len ; i+=4 ) {
arr.push(imgdata[i]+','+imgdata[i+1]+','+imgdata[i+2]+','+imgdata[i+3]);
}
這樣就可以拿到圖片的所有數(shù)據(jù)了,剩下的就是數(shù)學(xué)問(wèn)題了。
2、數(shù)據(jù)聚類
去重,相同色值合并,記錄該色值出現(xiàn)個(gè)數(shù)(權(quán)重)weight
聚類方法就比較多了,直接數(shù)學(xué)統(tǒng)計(jì),或者k-means,決策樹(shù),樸素貝葉斯,支持向量機(jī)等等,喜歡哪個(gè)就用哪個(gè)就可以了,但是還是需要考慮下不同方法的適用情況和效率什么的了。
我們會(huì)得到這樣一個(gè)數(shù)組 [{rgba: '21,12,45,0', weight: 12}, {...}]來(lái)記錄色值和出現(xiàn)次數(shù),
3、聚類結(jié)果排序
對(duì)上一步中得到的json數(shù)組進(jìn)行排序,根據(jù)屬性weight的值從大到小或者從小到大排序,排序算法就不用多言了。
4、結(jié)果預(yù)覽

5、to Do
相似色值合并
rgba(234,234,234,1)和rgba(234,235,235,1)類似的這種是否有必要合并成為一個(gè)值,這里又會(huì)涉及到相似度計(jì)算等問(wèn)題。
優(yōu)化聚類算法
提高復(fù)雜度,提升性能,提升執(zhí)行速度
結(jié)合可視化的一些東西
6、總結(jié)
數(shù)據(jù)多的處理還是放在后端比較合適,畢竟可以利用分布式框架等多端計(jì)算。
而瀏覽器處理數(shù)據(jù)的能力還是有限。
- 原生js獲取left值和top值的三種方法
- js瀏覽器滾動(dòng)條卷去的高度scrolltop(實(shí)例講解)
- Javascript實(shí)現(xiàn)的StopWatch功能示例
- JavaScript限制在客戶區(qū)可見(jiàn)范圍的拖拽(解決scrollLeft和scrollTop的問(wèn)題)(2)
- js中scrollTop()方法和scroll()方法用法示例
- 深入淺析JavaScript中的scrollTop
- js+css實(shí)現(xiàn)回到頂部按鈕(back to top)
- 使用堆實(shí)現(xiàn)Top K算法(JS實(shí)現(xiàn))
- 解決js頁(yè)面滾動(dòng)效果scrollTop在FireFox與Chrome瀏覽器間的兼容問(wèn)題的方法
- js中不同的height, top的區(qū)別對(duì)比
相關(guān)文章
JavaScript 在各個(gè)瀏覽器中執(zhí)行的耐性
經(jīng)常會(huì)遇到這樣一個(gè)情況:瀏覽器彈出對(duì)話框,提示腳本運(yùn)行時(shí)間過(guò)長(zhǎng),詢問(wèn)“停止”還是“繼續(xù)”。那究竟各個(gè)瀏覽器是如何判斷在什么時(shí)候才彈出此對(duì)話框呢?2009-04-04
整理CocosCreator常用知識(shí)點(diǎn)
這篇文章主要介紹了整理CocosCreator常用知識(shí)點(diǎn),這些知識(shí)點(diǎn),平時(shí)幾乎都能用到,希望同學(xué)們看完后,可以自己去試一下,加深印象2021-04-04
jquery對(duì)單選框,多選框,文本框等常見(jiàn)操作小結(jié)
本篇文章主要是對(duì)jquery對(duì)單選框,多選框,文本框等常見(jiàn)操作進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01
原生JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖功能【適合新手】
這篇文章主要介紹了原生JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖功能,結(jié)合實(shí)例形式分析了基于javascript定時(shí)器控制頁(yè)面元素動(dòng)態(tài)變換實(shí)現(xiàn)輪播圖的相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
js實(shí)現(xiàn)模擬計(jì)算器退格鍵刪除文字效果的方法
這篇文章主要介紹了js實(shí)現(xiàn)模擬計(jì)算器退格鍵刪除文字效果的方法,涉及javascript字符串截取操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05
JavaScript實(shí)現(xiàn)手寫(xiě)call/apply/bind的示例代碼
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)手寫(xiě)call/apply/bind的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaScript有一定的幫助,需要的可以參考一下2023-02-02
JS表單數(shù)據(jù)驗(yàn)證的正則表達(dá)式(常用)
這篇文章主要介紹了JS表單數(shù)據(jù)驗(yàn)證的正則表達(dá)式,這種方法比較常用,以及使用正則表達(dá)式驗(yàn)證表單的方法,本文給大家介紹非常詳細(xì),需要的的朋友參考下2017-02-02
調(diào)用innerHTML之后onclick失效問(wèn)題的解決方法
調(diào)用innerHTML之后,onclick失效了,這也是在意料之中的,因?yàn)閕nnerHTML是以文本形式插入的button,所以無(wú)法識(shí)別onclick事件2014-01-01

