#blur #gaussian #graphics #stackblur

nightly slur

一种快速、迭代、正确的 Stackblur 方法,生成非常平滑且高质量的输出,没有边缘渗色

1 个不稳定版本

0.1.0 2023年11月23日

#274渲染


2 个包中使用(通过 fimg

MIT 许可证

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的模糊半径。

用法

除了StackBlurrableStackBlur,它们自带文档外,还有如blurblur_argb这样的辅助函数,可以用来与2D图像缓冲区交互,因为手动进行此操作需要不安全的代码(如果你不想进行复制)。

更多信息请参见完整文档

依赖关系

~165KB