1 个不稳定版本
0.1.0 | 2023年11月23日 |
---|
#274 在 渲染 中
在 2 个包中使用(通过 fimg)
29KB
474 行
一种快速、迭代、正确的 Stackblur 方法,生成非常平滑且高质量的输出,没有边缘渗色。
此包实现了一个经过调整的 Stackblur 算法,需要 radius * 2 + 2
个空间元素,而不是 radius * 2 + 1
,这是为了大幅提高视觉质量而进行的微小权衡。
该算法作为迭代器(StackBlur
)公开,可以包装任何其他生成 StackBlurrable
元素的迭代器。然后,StackBlur
将生成由指定半径模糊的元素。
此包的优点
Stackblur 实质上是常数时间的。无论半径如何,它总是只对输入迭代器执行一次扫描,并输出相同数量的元素。
此外,它产生的结果与慢速且昂贵的高斯模糊相当。与使用基本移动平均的框模糊不同,Stackblur 使用加权平均,其中每个输出像素受其附近的输入的影响更大。
尽管如此,Stackblur 与简单的框模糊相比并没有表现得太差,与完整的高斯模糊相比,它至少在 CPU 上非常便宜。此包中的实现可能会击败大多数在 crates.io 上可以找到的未优化的模糊,以及一些优化过的模糊,并且它非常灵活和通用。
有关对 Stackblur 算法进行的改进的完整说明,请参阅 iter
模块。
https://user-images.githubusercontent.com/4723091/173788732-2e3e125e-f7b3-4e0f-8582-cc2c148ba437.mp4
(在上面的视频中,stackblur-iter
是居中的模糊,而全宽的那个是另一个 stackblur
包。)
与 stackblur
包的比较
stackblur
存在边缘溢出和灵活性问题。例如,它只能处理32位整数缓冲区,并期望它们是线性ARGB像素的打包。此外,它不能处理缓冲区的2D子切片(例如,imgref
允许此crate这样做),并且不提供任何流式迭代器或文档。并且它只支持最大255的模糊半径。
用法
除了StackBlurrable
和StackBlur
,它们自带文档外,还有如blur
和blur_argb
这样的辅助函数,可以用来与2D图像缓冲区交互,因为手动进行此操作需要不安全的代码(如果你不想进行复制)。
更多信息请参见完整文档。
依赖关系
~165KB