找出背景色的JS

網(wǎng)頁最麻煩的就是配色。

更麻煩的就是你好不容易配色好了本刽,結(jié)果圖片一換鲸湃,顏色還得重來。子寓。暗挑。

如果要求不高的話,能讓字看出來就好了斜友,但這個目的在遇到奇葩換圖的時候還是會蛋疼炸裆。

比如說,今天的背景圖是深色鲜屏,你來一個白色的字烹看,結(jié)果第二天換圖成了白色圖片,立刻抓瞎洛史。

所以惯殊,要用JS來實現(xiàn)自動簡單配色的話,事情就簡單多了——大概吧也殖。土思。。


要做到這個工作忆嗜,需要三個步驟己儒。

第一,找出目標文字的“背景圖”捆毫。

第二闪湾,找出背景圖在文字所在區(qū)域的顏色范圍。

第三冻璃,修改文字的顏色响谓,按照一定的規(guī)則。

這里只講大致的思路省艳,熟悉JS和HTML5的話娘纷,有了思路很快就能出成果了。


第一步跋炕,找出圖片赖晶。

document.querySelectorAll('img')這個是最先想到的。

但你要知道,背景圖可以不單單是img標簽所給的圖遏插,還可能是div等的background捂贿,所以光有這個還不行。

你需要搜索所有含有background或者background-image這兩個style字段的標簽胳嘲,找到以后讀取字段中的url部分厂僧,并解析獲得圖片實際路徑。如果是填充色或者漸變色的了牛,也可以通過css獲得具體的值颜屠,很容易。

這部分還要注意repeat屬性和size屬性鹰祸,這個都考驗計算的功力——涉及到的和尺寸計算所要的量都可以通過對象的getBoudingClientRect來獲得甫窟。

因此,無論是背景圖蛙婴,還是背景背景圖粗井,現(xiàn)在就都能獲得了。

接下來街图,就是根據(jù)對象的實際位置和大小浇衬,來判斷是否成為了指定文字的“背景”。

這里還是使用getBoundingClientRect來判斷各元素的位置餐济,并由此得到“背景”——需要注意的是径玖,opacity為0的,display為none的颤介,visibility為hidden的梳星,都可以不用考慮在內(nèi)。

如果有多個圖片都在指定區(qū)域范圍內(nèi)——準確地說滚朵,是圖片和文字所在區(qū)塊有交集——那么你還要通過層級關(guān)系冤灾、z-index、transform的translateZ屬性來獲得上下關(guān)系辕近,后者的話還要考慮父容器是否設(shè)置了perspective啟用3D韵吨。繁瑣是繁瑣了點,但只要仔細移宅,都不是什么大問題归粉。


第二步,找圖出片中和文字相關(guān)的區(qū)域漏峰。

找到了圖片糠悼,有了圖片的位置和尺寸,接下來就是找到區(qū)域浅乔。

不單單是找到區(qū)域倔喂,還要找出這個區(qū)域的像素铝条。

這里使用的就是HTML5中的Canvas對象了。

將圖片載入Canvas對象席噩,Canvas的大小和圖片的實際尺寸相當——如果是background屬性調(diào)用的話要注意repeat和size這兩個屬性班缰,然后所用都要注意是否使用了zoom(2D的CSS3屬性)或者scale(3D的CSS3屬性,而且這貨還分scaleX和scaleY)悼枢。根據(jù)實際CSS來控制Canvas的大小和縱橫比埠忘,然后在Canvas中繪制圖片。

接著馒索,利用文字區(qū)塊的所在區(qū)域——還是那個getBoundingClientRect给梅,計算和圖片的相對位置,從而取得要截取的Canvas位置双揪,使用getData獲得數(shù)據(jù)——是RGBA值。

此外要注意的是圖片本身設(shè)置的和透明度相關(guān)的css屬性——在現(xiàn)代瀏覽器上還有變色的filter這個css3屬性包帚,這兩個要注意渔期。好在無論是反色還是灰度還是黑白等等變化都可以通過簡單的算法來對最后的像素結(jié)果做處理。

接下來的是就容易了渴邦。

如果是多個圖片的合成區(qū)域疯趟,就根據(jù)圖片之間的疊加關(guān)系來除了getData的像素結(jié)果,最后生成一塊Data谋梭。

有了像素數(shù)據(jù)信峻,做一個平均,或者根據(jù)你個人的喜好或者美工需求來獲得一個數(shù)字瓮床。

打完收工盹舞。


第三步,設(shè)置圖片顏色隘庄。

有了第二部獲得RGBA值得踢步,接下來就是根據(jù)反色或者別的需求來獲得文字的RGBA值。

可以通過一定的數(shù)據(jù)分析來判斷上述背景區(qū)域是否需要分塊處理丑掺,比如左面是白色获印,右面是黑色,這個就看你數(shù)據(jù)處理的能力了街州,一般使用像素值的剃度變化量就可以做到這件事兼丰。

如果需要分塊的,那么使用不可見的span套用和目標文字塊相同的css屬性唆缴,然后通過試錯法來獲得分塊鳍征。

有了分塊,有了背景色面徽,接下來就是CSS設(shè)置文字顏色的事了蟆技,這部分輕松愉快,不廢話。


上面就是一個自動設(shè)置背景的JS插件的基本思路质礼,有興趣的朋友可以自己做哦~~~~



------------


當然旺聚,需要注意的是:這個方法本身是“泛用型”的,也就是說眶蕉,不管是什么網(wǎng)頁砰粹,丟上去就能用(只要瀏覽器達到現(xiàn)代水平)。

但造挽,對于一些特定類型的網(wǎng)站其實不需要這么泛用碱璃,可以是具有很強針對性的方案。

比如說饭入,這個網(wǎng)頁是我做的嵌器,背景在哪里我知道,只不過背景圖片是隨機抽的一張圖片谐丢。如果是這樣的話爽航,上述尋找圖片和繪制區(qū)域的過程都可以省略,直接寫成參數(shù)就可以了乾忱,這樣可以節(jié)約很多工作量讥珍。

所以,推薦是有針對性地使用背景自動匹配窄瘟,而不是泛用型的衷佃,畢竟我們也要為別人的瀏覽器考慮考慮,不是么蹄葱?



==================


當然氏义,上面是將工作放到前段來完成的方法,工作壓力都在前段图云。

但觅赊,事實上也可以把這個自動化的工作交給后端來完成——

使用PhantomJS繪制一個沒有指定文字區(qū)域的頁面截圖,然后NodeJS使用成熟的圖形庫(以前我自己做過一個基于Cairo的NodeJS的圖像處理插件琼稻,也有成熟的NodeCanvas庫或者NodeWebkit解決方案)來獲得像素吮螺,最后算出文字的顏色——下面是關(guān)鍵——將顏色寫在文件名里,然后前段根據(jù)URL中的背景圖片的文件名就知道自己應(yīng)該是什么顏色了帕翻。

這個操作僅僅在圖片入庫的時候進行一次鸠补,之后前后段都沒有工作量,而且也可以不用考慮前段瀏覽器居然是老舊的IE這樣的非人類問題嘀掸。

當然紫岩,現(xiàn)代瀏覽器的話結(jié)合LocalStorage也可以做到僅入庫的時候做一次自動抓取背景色的工作,但總是比較麻煩的睬塌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泉蝌,一起剝皮案震驚了整個濱河市歇万,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勋陪,老刑警劉巖贪磺,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诅愚,居然都是意外死亡寒锚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門违孝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刹前,“玉大人,你說我怎么就攤上這事雌桑±恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵校坑,是天一觀的道長拣技。 經(jīng)常有香客問我,道長撒踪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任大渤,我火速辦了婚禮制妄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泵三。我一直安慰自己耕捞,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布烫幕。 她就那樣靜靜地躺著俺抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪较曼。 梳的紋絲不亂的頭發(fā)上磷斧,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音捷犹,去河邊找鬼弛饭。 笑死,一個胖子當著我的面吹牛萍歉,可吹牛的內(nèi)容都是我干的侣颂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼枪孩,長吁一口氣:“原來是場噩夢啊……” “哼憔晒!你這毒婦竟也來了藻肄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拒担,失蹤者是張志新(化名)和其女友劉穎嘹屯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澎蛛,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡抚垄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谋逻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呆馁。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毁兆,靈堂內(nèi)的尸體忽然破棺而出浙滤,到底是詐尸還是另有隱情,我是刑警寧澤气堕,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布纺腊,位于F島的核電站,受9級特大地震影響茎芭,放射性物質(zhì)發(fā)生泄漏揖膜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一梅桩、第九天 我趴在偏房一處隱蔽的房頂上張望壹粟。 院中可真熱鬧,春花似錦宿百、人聲如沸趁仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雀费。三九已至,卻和暖如春痊焊,著一層夾襖步出監(jiān)牢的瞬間盏袄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工薄啥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留貌矿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓罪佳,卻偏偏與公主長得像逛漫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赘艳,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容