Byakuren:一個 C 實現的主題色提取庫

死月發表於2017-03-03

原文地址: https://xcoder.in/2017/03/03/…

好久沒發文章了,藉著 Byakuren 開源的檔口炒炒冷飯吧。

先上 Repo 地址:https://github.com/XadillaX/byakuren

主題色

影像主題色是從一張影像中提取出來最能代表這張圖片主色調的多種顏色。 也就是說在一幅色彩斑斕的圖片裡面,各種不同顏色的數量就對應著該顏色在圖 片中的比例,程式可以通過計算圖片中不同顏色的畫素數來算出主題色。

主題色提取演算法

提取的演算法在我之前的部落格中有說明。在 Byakuren 中其實用的就是之前部落格中講的一些演算法。

除去上面兩種演算法, Byakuren 還提供了將這兩種演算法結合起來的 Mix 演算法。

Byakuren

Byakuren 是我前兩年寫的一個主題色提取庫,也是繼 thmclrx 之後的 C 版實現,個人認為程式碼質量比舊版的 thmclrx 要高。並且它實際上經過了企業級的驗證,在某相關的公司已經歡快跑了有些年頭了。

在經過相關人員的同意下,我也算把這雪藏了好久的程式碼給開源出來了。

偽·Byakuren 是什麼?

byakuren

聖 白蓮(ひじり びゃくれん, Hiziri Byakuren )是系列作品《東方 project 》中的角色,首次登場於《東方星蓮船》。

  • 種族:魔法使

  • 能力:使用魔法程度的能力(酣暢增強身體能力的)

  • 危險度:不明

  • 人類友好度:中

  • 主要活動場所:命蓮寺之類

  • 命蓮寺的住持。雖然原本是人類,不過由於常年的修行已經完全超越了人類。現在已經屬於人們常說的魔法使了。

雖然已經入了佛門,但是不知道什麼原因卻被妖怪敬仰著。她從來沒有像童話故事中的魔法使那樣,唸誦著咒語治退妖怪。使用的力量完全是邪惡的,一點都不像是聖人,雖然並沒有人目擊到她與人類為敵,但其實已徹底成為妖怪的同伴了。

好吧,總之本人是個東方控,所以基本上專案名都跟東方有關。

真·Byakuren 是什麼?

如文章題目所說,它是一個 C 實現的開源主題色提取的庫,大家可以把它編譯成連結庫使用。

不過目前暫時只支援 Makefile 的形式來編譯,大家如果有興趣也可以自己建個 Windows 下的 Visual Studio 專案等,也歡迎提類似於 CMake 之類的 PR 。

使用

其實詳細的使用方法在文件中就有說明。

不過這裡還是簡單介紹一下吧。

Clone

先把程式碼給下下來,你也可以把它 Clone 下來。總之倉庫地址是:https://github.com/XadillaX/byakuren

make

然後跑到目錄下執行 make

$ make byakuren

你將得到一個 byakuren.a 的靜態連結庫。

這個時候你只要拿著這個靜態連結庫,然後順便在你的專案中把標頭檔案引進來就可以了。

#include "byakuren.h"

API

我們假設你有 bkr_rgb* rgb 的圖片畫素資訊,以及 uint32_t color_count 的圖片畫素總數兩個變數,下面分別給出三個樣例。具體的 API 解析還請去文件觀摩。

Octree
bkr_color_stats stats[256];
bkr_octree_node* root = bkr_build_octree(rgb, color_count, 256);
int colors = bkr_octree_calculate_color_stats(root, stats);
bkr_release_octree(root);

colors 就是主題色數量了,傳進去的 stats 就會接收到主題色的具體資訊了。

Min-diff
bkr_color_stats stats[256];
bkr_mindiff_parameter param;
param.gray_offset = 5;
param.palette = NULL;
int colors = bkr_mindiff_calculate_color_stats(rgb, color_count, stats, &param);

colorsstats 如上所述。

Mix
bkr_color_stats stats[256];
bkr_mindiff_parameter param;
param.gray_offset = -1;
param.palette = NULL;
int colors = bkr_mix_calculate_color_stats(rgb, color_count, 256, &param, stats);

colorsstats 如上所述。

預覽一下

可能有人想看看效果,我這裡就放個效果圖給大家看看吧。

其中 Octree 和 Mix 兩個演算法的主題色最大數量引數傳的都是 16 。

效果預覽

能做什麼?

你可以拿它來寫一些主題色提取的東西。

你也可以拿它來完成其它語言的主題色提取庫的封裝,如 Python 、 Lua 等等。歡迎反饋給我。

結束語

把一份自己覺得還不錯的程式碼開源出來的感覺特爽,尤其是這種重見天日的感覺。ヘ|・∀・|ノ*~●

相關文章