好久沒發(fā)文章了痪宰,借著 Byakuren 開源的檔口炒炒冷飯吧昔汉。
先上 Repo 地址:https://github.com/XadillaX/byakuren宪迟。
主題色
圖像主題色是從一張圖像中提取出來最能代表這張圖片主色調(diào)的多種顏色陕凹。 也就是說在一幅色彩斑斕的圖片里面望忆,各種不同顏色的數(shù)量就對應(yīng)著該顏色在圖 片中的比例,程序可以通過計算圖片中不同顏色的像素數(shù)來算出主題色阐虚。
主題色提取算法
提取的算法在我之前的博客中有說明序臂。在 Byakuren 中其實(shí)用的就是之前博客中講的一些算法。
除去上面兩種算法实束, Byakuren 還提供了將這兩種算法結(jié)合起來的 Mix 算法奥秆。
Byakuren
Byakuren 是我前兩年寫的一個主題色提取庫,也是繼 thmclrx 之后的 C 版實(shí)現(xiàn)咸灿,個人認(rèn)為代碼質(zhì)量比舊版的 thmclrx 要高构订。并且它實(shí)際上經(jīng)過了企業(yè)級的驗(yàn)證,在某相關(guān)的公司已經(jīng)歡快跑了有些年頭了避矢。
在經(jīng)過相關(guān)人員的同意下鲫咽,我也算把這雪藏了好久的代碼給開源出來了签赃。
偽·Byakuren 是什么?
聖 白蓮(ひじり びゃくれん分尸, Hiziri Byakuren )是系列作品《東方 project 》中的角色锦聊,首次登場于《東方星蓮船》。
- 種族:魔法使
- 能力:使用魔法程度的能力(酣暢增強(qiáng)身體能力的)
- 危險度:不明
- 人類友好度:中
- 主要活動場所:命蓮寺之類
- 命蓮寺的住持箩绍。雖然原本是人類孔庭,不過由于常年的修行已經(jīng)完全超越了人類。現(xiàn)在已經(jīng)屬于人們常說的魔法使了材蛛。
雖然已經(jīng)入了佛門圆到,但是不知道什么原因卻被妖怪敬仰著。她從來沒有像童話故事中的魔法使那樣卑吭,念誦著咒語治退妖怪芽淡。使用的力量完全是邪惡的,一點(diǎn)都不像是圣人豆赏,雖然并沒有人目擊到她與人類為敵挣菲,但其實(shí)已徹底成為妖怪的同伴了。
好吧掷邦,總之本人是個東方控白胀,所以基本上項(xiàng)目名都跟東方有關(guān)。
真·Byakuren 是什么抚岗?
如文章題目所說或杠,它是一個 C 實(shí)現(xiàn)的開源主題色提取的庫,大家可以把它編譯成鏈接庫使用宣蔚。
不過目前暫時只支持 Makefile 的形式來編譯向抢,大家如果有興趣也可以自己建個 Windows 下的 Visual Studio 項(xiàng)目等,也歡迎提類似于 CMake 之類的 PR 胚委。
使用
其實(shí)詳細(xì)的使用方法在文檔中就有說明挟鸠。
不過這里還是簡單介紹一下吧。
Clone
先把代碼給下下來篷扩,你也可以把它 Clone 下來≤哉担總之倉庫地址是:https://github.com/XadillaX/byakuren鉴未。
make
然后跑到目錄下執(zhí)行 make
。
$ make byakuren
你將得到一個 byakuren.a
的靜態(tài)鏈接庫鸠姨。
這個時候你只要拿著這個靜態(tài)鏈接庫铜秆,然后順便在你的項(xiàng)目中把頭文件引進(jìn)來就可以了。
#include "byakuren.h"
API
我們假設(shè)你有 bkr_rgb* rgb
的圖片像素信息讶迁,以及 uint32_t color_count
的圖片像素總數(shù)兩個變量连茧,下面分別給出三個樣例。具體的 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
就是主題色數(shù)量了啸驯,傳進(jìn)去的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, ¶m);
colors
和stats
如上所述。
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, ¶m, stats);
colors
和stats
如上所述罚斗。
預(yù)覽一下
可能有人想看看效果徙鱼,我這里就放個效果圖給大家看看吧。
其中 Octree 和 Mix 兩個算法的主題色最大數(shù)量參數(shù)傳的都是 16 针姿。
能做什么袱吆?
你可以拿它來寫一些主題色提取的東西。
你也可以拿它來完成其它語言的主題色提取庫的封裝距淫,如 Python 绞绒、 Lua 等等。歡迎反饋給我榕暇。
結(jié)束語
把一份自己覺得還不錯的代碼開源出來的感覺特爽蓬衡,尤其是這種重見天日的感覺。?|???|?*~●