如何生成一個覆蓋廣的色板

原文地址:http://xcoder.in/2014/10/16/generate-color-space/

用途

在主題色提取的過程中榨婆,要把顏色加入搜索引擎稽莉。但是如果是真彩色任意值加進去的話螺捐,對于搜索的時候來說無疑是一個復雜的操作。搜索條件要各種計算距離什么的。

于是一個妥協(xié)的做法就是提供一套調(diào)色板泌神,保證所有顏色都被吸納到調(diào)色板中的某一色值當中。

那么這個時候調(diào)色板的覆蓋率以及距離什么的就比較重要了舞虱。本文就講如何生成一套看起來還不錯的自用“標準色板”欢际。

Windows 色板

一開始我用了一套 256 色的色板,不知道哪里搞來的 Windows 色板矾兜。

由于顏色太多损趋,不好貼代碼,我就直接把鏈接貼過來了:

點我萌萌噠 ?(?д?)?!!

這一套色板大致的效果如下:

這里不支持嵌入 JS 代碼之類的東西椅寺,我就附上原文的效果了

生成更好的色板

我指的更好并不一定真的比之前找到的 256 色要好浑槽,畢竟上面那個是人家智慧和勞動的結(jié)晶蒋失。我指的更好是顏色更多,但是偏差又不會太大桐玻。

理論上我們能按照那種規(guī)則生成比真彩色少的任意種數(shù)的色板篙挽。

相關(guān)的色彩模式

這里有必要重新普及下 N 多種色彩模式中的其中兩種,也就是我們今天生成一個色板所用到的兩種模式镊靴。

RGB 色彩模式

這個大家都已經(jīng)耳熟能詳了铣卡,無非是 RGB 通道中的分量結(jié)合起來生成的一種顏色。

RGB 色彩模式是工業(yè)界的一種顏色標準偏竟,是通過對紅 (R)煮落、綠 (G)、藍 (B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的苫耸,RGB 即是代表紅州邢、綠、藍三個通道的顏色褪子,這個標準幾乎包括了人類視力所能感知的所有顏色量淌,是目前運用最廣的顏色系統(tǒng)之一。

使用 RGB 模型為圖像中每一個像素的 RGB 分量分配一個 0 ~ 255 范圍內(nèi)的強度值嫌褪。RGB 圖像只使用三種顏色呀枢,就可以使它們按照不同的比例混合,在屏幕上呈現(xiàn) 16777216 (256 * 256 * 256) 種顏色笼痛。

HSL 色彩模式

HSL 色彩模式是工業(yè)界的一種顏色標準裙秋,是通過對色相 (H)、飽和度 (S)缨伊、明度 (L) 三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的摘刑,HSL 即是代表色相,飽和度刻坊,明度三個通道的顏色枷恕,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統(tǒng)之一谭胚。

HSL 色彩模式就是今天的主角了徐块。我們將會用 HSL 生成一張類似下圖的色板,而色板的粒度將會與你決定色板的顏色數(shù)量相關(guān):

HSL Color Space
HSL Color Space

代碼實現(xiàn)

為了簡化代碼灾而,我們暫時不考慮飽和度胡控,也就是說所有顏色讓它飽和度都為 100%

而且實際上色相是在一個圓里面的 0° ~ 360°旁趟,那么也就是說我們只需要做兩步就是了:

  1. 色相 0° ~ 360° 循環(huán)昼激;
  2. 以及明度 0% ~ 100% 循環(huán)。

在這里我定了一個步長:色相以 10° 為一個步長,明度以 5% 為一個步長癣猾。并且剔除 RGB 相等的黑白灰色敛劝。

當然這里步長完全可以按照自己的喜好來。

我們以前端的 Javascript 為例纷宇,能想到下面的一段代碼:

var count = 0;
$(function() {
    for(var i = 19; i >= 0; i--) {
        for(var j = 0; j < 36; j++) {
            $("#palette").append("<div class='color'></div>");
            $(".color").eq(count++).css("background-color", "hsl(" + (j * 10) + ", " + "100%, " + parseInt(((i + 1) / 21) * 100) + "%)");
        }
        $("#palette").append("<div style='clear: both;'></div>");
    }
});

這里需要注意的是,實際上我明度的步長是 (100 / 22)蛾方。然后 0100 這兩個明度我們另外拎出來像捶,所以只取了 1 ~ 21 的明度。

剩下的就是跟剛才說的一樣桩砰,各色相的各明度生成一個 HSL 顏色賦值給 background-color拓春。

接下去我們生成一個灰色條的色板,專治灰黑白亚隅。這個時候?qū)嶋H上我們可以直接用 RGB 搞定:

$("#palette").append("<br />");
for(var i = 0; i < 36; i++) {
    $("#palette").append("<div class='color'></div>");
    var val = parseInt(((19 - i) / 19) * 255);
    $(".color").eq(count++).css("background-color", "rgb(" + val + ", " + val + ", " + val + ")");
}

最后把顏色輸出到一個數(shù)組就好了硼莽。

這里有一點 happy 的是,就算你是用 HSL 來搞的背景色煮纵,用 jQuery$(foo).css("background-color") 獲取到的仍然是 RGB 值懂鸵。

var colors = [];
$(".color").each(function() {
    var result = /rgb\((\d+), (\d+), (\d+)\)/.exec($(this).css("background-color"));
    colors.push({ r: parseInt(result[1]), g: parseInt(result[2]), b: parseInt(result[3]) });
});

$("textarea").val(JSON.stringify(colors));

所以最后我們還需要初始的 HTML 了:

<textarea></textarea>
<div id="palette"></div>
<div style="clear: both;"></div>

效果的話這里能看到:

小結(jié)

用 HSL 生成的色彩空間(色板)一個是表現(xiàn)力好,相對于 RGB 來說行疏,好像更好知道如何去生成分部比較 OK 的一個色彩空間匆光。

但是也有一個缺點,當我們不去管飽和度的時候酿联,實際上我們還是丟失了一部分的顏色终息。好在本身我們生成色板也只是為了合并顏色,可以通過 k-D 樹來快速尋找某個顏色在色板中是屬于哪種色塊的贞让。當然周崭,目前我們就是這么做的。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喳张,一起剝皮案震驚了整個濱河市续镇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹲姐,老刑警劉巖磨取,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柴墩,居然都是意外死亡忙厌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門江咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逢净,“玉大人,你說我怎么就攤上這事〉粒” “怎么了甥雕?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胀茵。 經(jīng)常有香客問我社露,道長,這世上最難降的妖魔是什么琼娘? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任峭弟,我火速辦了婚禮,結(jié)果婚禮上脱拼,老公的妹妹穿的比我還像新娘瞒瘸。我一直安慰自己,他們只是感情好熄浓,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布情臭。 她就那樣靜靜地躺著,像睡著了一般赌蔑。 火紅的嫁衣襯著肌膚如雪俯在。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天惯雳,我揣著相機與錄音朝巫,去河邊找鬼。 笑死石景,一個胖子當著我的面吹牛劈猿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潮孽,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼揪荣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了往史?” 一聲冷哼從身側(cè)響起仗颈,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椎例,沒想到半個月后挨决,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡订歪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年脖祈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷晋。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖高,死狀恐怖慎陵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喻奥,我是刑警寧澤席纽,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站撞蚕,受9級特大地震影響润梯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甥厦,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一仆救、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矫渔,春花似錦、人聲如沸摧莽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镊辕。三九已至油够,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間征懈,已是汗流浹背石咬。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卖哎,地道東北人鬼悠。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像亏娜,于是被迫代替她去往敵國和親焕窝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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