CQuant: 也许是Node下最快的主题色提取包了

1,145 阅读1分钟

先看下对比:

测试结果根据具体机器而不同

JPG 5572 x 3715

Program Time(ms)
cquant 14-15 ms
image-palette N/A

N/A: crashed.....

JPG 1920 x 1280

Program Time(ms)
cquant 3ms
image-palette 950ms

起因

最近需要用到提取主题色,结果呵呵呵,我的Main Loop被疯狂Block. 难道Node就不能异步进行CPU-bound任务吗???

JS不能,C++能. 一番调查之后发现Node的原生拓展(node addon)是能够支持“多线程”,其实Node本身就是多线程的呀,只是JS接触不到. 了解了n-api 和node addon api之后发现node-addon-api 是真的简单.

实现

node-api-api 提供了一个超棒的类:Napi::AsyncWorker,我们只需要继承这个类,然后重写Execute函数Node就可以自动帮我们分配线程来运行,完全不用担心阻塞啦。

// 片段
void Execute() {
    counter = (size_t *)malloc(sizeof(size_t) * max_color);
    // pix_median_cut_quant MMCQ 耗时任务
    cmap = pix_median_cut_quant(pix, max_color, 5, 0, counter);
}

具体的细节可以查阅我的项目。

使用

既然这么好我咋在npm上没看到呢???

因为项目还没完全测试,有些细节还没实现,现在基本可用.所以本着不祸害别人的基本原则,还是先不上传

cquant项目地址

更多

写这个项目也学到很多东西,准备写几篇博客分别介绍吧。

TBC...