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 Rxjs mergeMap 的使用場(chǎng)合
這篇文章主要介紹了JavaScript Rxjs mergeMap 的使用場(chǎng)合,mergeMap 接收一個(gè)函數(shù)作為輸入?yún)?shù),這個(gè)函數(shù)的輸入?yún)?shù)就是通過(guò) pipe 鏈接 mergeMap 的 Observable 里包含的元素2022-07-07JavaScript call apply使用 JavaScript對(duì)象的方法綁定到DOM事件后this指向問(wèn)題
JavaScript對(duì)象與DOM對(duì)象進(jìn)行綁定會(huì)遇到一個(gè)問(wèn)題:如果被綁定的對(duì)象的方法中包含this關(guān)鍵字,當(dāng)事件被觸發(fā)時(shí)this指向的卻是DOM對(duì)象,而不是之前的JS對(duì)象。2011-09-09js加載之使用DOM方法動(dòng)態(tài)加載Javascript文件
傳統(tǒng)上,加載Javascript文件都是使用script標(biāo)簽,我們也可以使用DOM方法,動(dòng)態(tài)加載Javascript文件,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-11-11js實(shí)現(xiàn)當(dāng)前輸入框高亮顯示的方法
這篇文章主要介紹了js實(shí)現(xiàn)當(dāng)前輸入框高亮顯示的方法,涉及javascript針對(duì)輸入框樣式動(dòng)態(tài)設(shè)置的技巧,非常美觀大方,簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-08-08JavaScript獲取當(dāng)前網(wǎng)頁(yè)標(biāo)題(title)的方法
這篇文章主要介紹了JavaScript獲取當(dāng)前網(wǎng)頁(yè)標(biāo)題(title)的方法,涉及javascript中document.title方法的使用,需要的朋友可以參考下2015-04-04基于javascript的JSON格式頁(yè)面展示美化方法
本文介紹的方法基于javascript,css和myFunction結(jié)合可實(shí)現(xiàn)頁(yè)面展示轉(zhuǎn)換,下面有個(gè)示例,大家可以參考下2014-07-07Javascript Memoization 緩存函數(shù)使用說(shuō)明
Memoization 是一種將函數(shù)返回值緩存起來(lái)的方法,學(xué)習(xí)js 面向?qū)ο蟮呐笥芽梢詤⒖枷隆?2010-05-05