Quadim四叉树风格化图像/视频渲染
Quadim
迄今为止最快的图像四叉树风格化实现,拥有上每秒上百帧的处理速度并且能够避免丑陋的长方形
安装
- 安装 rust
- 打开命令行,运行:
cargo install quadim -F build-bin
,听着散热器的嗡嗡声,几分钟就好了。
使用前的准备
1.建议建立用于存放中间过程的图片的文件夹
1 | mkdir frames #用于存放拆帧后的图片 |
2.如果你要对视频进行处理,请先用FFmpeg
对视频进行拆帧处理
1 | ffmpeg -i .\<输入文件(请自行修改)>.mp4 -q 2 .\frames\%05d.jpg |
3.(举例)假如我对frames
文件夹进行了处理
1 | # 相关参数设置请勿照抄, 请参考下面的参数的用法和意义 |
4.最后用FFmpeg
合并处理后的图片(请保留原始输入视频文件)
1 | ffmpeg -framerate <帧数与原文件相同> -i .\output\%04d.png -i .\<输入文件(请自行修改)>.mp4 -map 0:v:0 -map 1:a:0 -c:v h264 -c:a copy -crf 20 .\output.mp4 |
参数的用法和意义
1 | 使用方法: quadim.exe [参数] <输入文件路径> |
展示
1 | quadim E:\TESTRANGE\pic\121\out --ratio 20:18 --stroke-width 1 |
1 | quadim E:\TESTRANGE\pic\121\out --ratio 24:25 --depth 6 --shape circle --bg-color transparent |
原图
都已经包装好了。不过需要注意的是,目前并不提供稳定性保证。(因为我不知道该怎么保证 (○` 3′○))
文档……凑合着看看吧。注意analyze()
和render()
这俩函数,它们即是一切。
特性列表
- 多线程!迄今为止最快的实现。
- 以 RGBA-8 格式处理图像。
- 合并测试在 YCbCr 而非 RGB 空间。
- 由于没有抗锯齿,因此在提供
--shape rect --border-width N
,(N > 0)
渲染参数时,实际上只会绘制左侧和上侧的边框。在指定较大的border_width
以及突兀的border_color
时会更加明显。 - 对于颜色参数:你可以传入
DarkSlateGray
、hsla(168, 100%, 50%, 1)
,等等所有CSS里能写的颜色。(感谢 csscolorparser)
画饼
- 🔥 允许自定义笔刷,比如随时间旋转的十字、随音乐律动的光点、在HSL颜色空间过滤特定颜色!等等。
- 更友好的CLI:允许一次传入多张图片,以及自动探测最合适的切片比例。
- 把分析和渲染完全分离,允许直接存取四叉树二进制格式……
Quadim 的原理?
-
使用 clap 解析命令行输入;使用 src-dst-clarifier 来处理源到目标文件的映射;使用 threadpool 进行并行处理。
-
Analyze 阶段
-
根据
GenericParams::slicing_ratio
将图像划分成一个个子块。通常需要选择正确的比例来让子块保持正方形,比如-r 16:9
。 -
对每个子块,根据
GenericParams::max_depth
深度优先地遍历四叉树。(存在一行代码限制了真正的最大深度,以保证子图像的边长始终大于零像素) -
尝试合并所有子块。
能合并的情况有两种:
-
抵达了最大深度,则这块区域的所有像素始终被合并,计算平均值并缓存。
-
检查自身的四个子块左上角的四个像素,计算它们的标准差或是极差(根据
AnalyzeParams::merge_method
)并与AnalyzeParams::thres_
进行比较,若认为波动程度小则允许合并。然后再计算平均值并缓存。不能合并的情况有两种:
-
情况二的反相。
-
子块的子块的子块……不能合并。
-
-
额外的数据结构
[CanvasPixel]
缓存“颜色平均值”和“该不该合并”。(像素颜色平均值储存在相当于子块左上角的位置,通过右移可以很容易地寻址。
[CanvasPixel]
本身是一维的,但被抽象成与图像相同的大小,这就是为什么图像的像素数不能大于缓存的长度。) -
遍历完成后,四叉树信息已经被完整记录在缓存中了。由于没有任何数据被重复计算,因此 Quadim 十分高效。
-
-
Render 阶段
这回是广度优先遍历四叉树了。简单来说就是把“颜色”从四叉树中取出并用“画笔”(trait
Brush
)画到原图上。由于新图的大小保证与原图相同,因此可以在原始图像缓冲区上就地操作,不需要额外的内存分配,这是 Quadim 保持高效的另一个要素。
已知问题
- 在绘制较大的圆/椭圆时,它会被裁掉一部分。(详见 image-rs/imageproc#519)
附录:exit code
含义
- 成功
- 部分错误
- 错误过多,提前终止
- 致命错误,在处理任何图像前就已经退出;一般是传错参数了