5 个版本
0.2.0 | 2021 年 1 月 7 日 |
---|---|
0.1.3 | 2020 年 11 月 9 日 |
0.1.2 | 2020 年 10 月 30 日 |
0.1.1 | 2020 年 10 月 30 日 |
0.1.0 | 2020 年 8 月 30 日 |
#546 in 图像
在 2 个crate中使用(通过picasso-core)
5MB
2.5K SLoC
purrmitive
将 purrmitive
作为库使用
purrmitive = "*"
或者安装 purr
作为二进制文件
cargo install --bin purr --features="cli" purrmitive
或者
cargo run --release --features=cli --bin=purr -- -i ./assets/input.png -o output.gif -n 100
大多数 primitive
标志都受支持,在大多数情况下应该可以作为直接替换。
USAGE:
purr [FLAGS] [OPTIONS] -i <input> -n <number> -o <output>
FLAGS:
-h, --help Prints help information
-v the level of verbosity, v/vv/vvv
-V, --version Prints version information
OPTIONS:
-a <alpha> alpha value
-b <background> starting background color (hex)
-i <input> input image
-m <mode> mode: 0=combo 1=triangle 2=rect 3=ellipse 4=circle 5=rotatedrect 6=beziers 7=rotatedellipse
8=polygon(default 1)
-n <number> number of shapes
-o <output> output image
-r <resize> input size
-s <size> output size
-j <thread> numebr of threads
输出格式
支持 png、jpg、svg 和 gif。您还可以在输出文件名中包含 {}
,例如,-o "/tmp/out/out{}.png"
将将每个帧保存到该目录中为 /tmp/out/outX.png
X 在 [1, n] 范围内
示例
使用
-i ./assets/input.png -o output.gif -n 150
原始 | 输入图像 | 输出图像 | 处理 |
---|---|---|---|
三角形 | ![]() |
![]() |
![]() |
椭圆形 | ![]() |
![]() |
![]() |
自己尝试更多。
差异
输出差异
实现了所有 primitive 支持的图形,所有图形的输出(除了贝塞尔曲线)基本上是相同的。
原始 primitive 版本的贝塞尔曲线支持调整线条粗细,这在 purr 中是不可能的。但结果仍然不错。
使用差异
purr 的关键选项和参数与 primitive 相同,在大多数情况下您只需用 purr 替换 primitive。
以上未列出的其他参数尚未实现(这些参数将在未来得到支持)
性能差异
在我电脑上,所有类型的图形拟合都比 primitive 快。更多具体数据请参见下一节。
一个可能的原因是在我的实现中,通过修改 diff 函数跳过了“下一步”缓冲区。与复制当前缓冲区、更新它然后读取它相比,这成本更低。
关于性能
此程序是 CPU 密集型,它将所有渲染都在内存中进行。
Purr 比原始实现更快。
使用以下基准测试:-n 100 -m {0-8}
,请查看以下结果。
hyperfine --parameter-scan m 0 8 -D 1 './target/release/purr -i ./assets/input.png -o assets/purr.{m}.png -n 100 -m {m}' '~/go/bin/primitive -i ./assets/input.png -o assets/primitive.{m}.png -n 100 -m {m}' --export-json benchmark.json
命令 | 模式 | 平均值 [s] | 最小值 [s] | 最大值 [s] | 结果 |
---|---|---|---|---|---|
purr | 组合 | 10.256 ± 0.385 | 9.202 | 10.467 | ![]() |
原始 | 组合 | 15.068 ± 0.213 | 14.785 | 15.405 | ![]() |
purr | 三角形 | 6.927 ± 0.201 | 6.510 | 7.136 | ![]() |
原始 | 三角形 | 10.577 ± 0.266 | 10.109 | 10.879 | ![]() |
purr | 矩形 | 6.224 ± 0.087 | 6.132 | 6.380 | ![]() |
原始 | 矩形 | 7.505 ± 0.105 | 7.388 | 7.765 | ![]() |
purr | 椭圆形 | 12.516 ± 0.098 | 12.354 | 12.674 | ![]() |
原始 | 椭圆形 | 14.643 ± 0.279 | 14.189 | 15.193 | ![]() |
purr | 圆形 | 15.054 ± 0.236 | 14.739 | 15.452 | ![]() |
原始 | 圆形 | 17.375 ± 0.187 | 17.156 | 17.760 | ![]() |
purr | 旋转矩形 | 8.045 ± 0.081 | 7.938 | 8.220 | ![]() |
原始 | 旋转矩形 | 9.181 ± 0.154 | 8.922 | 9.496 | ![]() |
purr | 贝塞尔曲线 | 3.050 ± 0.127 | 2.815 | 3.223 | ![]() |
原始 | 贝塞尔曲线 | 11.951 ± 0.173 | 11.563 | 12.114 | ![]() |
purr | 旋转椭圆 | 12.282 ± 0.166 | 11.942 | 12.496 | ![]() |
原始 | 旋转椭圆 | 27.795 ± 0.401 | 27.273 | 28.694 | ![]() |
purr | 多边形 | 8.355 ± 0.219 | 7.988 | 8.748 | ![]() |
原始 | 多边形 | 15.995 ± 0.275 | 15.426 | 16.431 | ![]() |
依赖项
~18MB
~147K SLoC