1. 基础知识
高斯模糊(Gaussian Blur)是一种常见的图像处理技术,通常用于平滑图像、减少噪声或模拟景深效果。其基本原理是通过一个高斯函数对图像进行卷积,使得图像中每个像素的值变成其周围像素的加权平均值,权重由高斯分布决定。
高斯模糊的原理,高斯模糊的核心是高斯函数,它是一个钟形曲线,符合正态分布。二维高斯函数的表达式为:
其中:x 和 y 是二维平面中的坐标。σ 是标准差,决定了模糊的强度,值越大模糊效果越明显。
高斯模糊的过程就是将图像中的每一个像素都使用这个高斯函数进行加权平均,以该像素为中心,结合其邻近像素的值来计算新的像素值。
高斯模糊的特点
- 平滑效果好:高斯模糊可以有效减少图像中的噪声和细节,产生一种平滑的视觉效果。
- 边缘模糊:高斯模糊会模糊图像的所有区域,包括边缘,这会使得图像看起来柔和但不再清晰。
- 计算复杂度适中:虽然高斯模糊相比简单的均值模糊运算复杂,但由于其对每个像素的权重是按距离加权,效果也更加自然。
高斯模糊的应用场景
- 图像降噪:高斯模糊经常用于图像预处理阶段,通过模糊细小的噪声来简化后续处理。
- 模糊效果:它广泛应用于图像编辑软件中,作为一种基础的模糊工具。
- 背景模糊:在用户界面设计中,常用于背景模糊处理以突出前景内容,类似于 Android 的模糊背景效果。
- 计算机视觉:在边缘检测之前,通常会先应用高斯模糊,以降低图像中的不规则噪声。
在 Android 中,实现窗口(Window)的模糊背景效果,尤其是高斯模糊效果,常用于模糊背景以突出前景内容的 UI 设计。使用 Window 的 setBackgroundBlurRadius()
google 引入了 Window.setBackgroundBlurRadius(),它允许直接在 Window 上设置模糊效果。通过这种方式可以对窗口背景进行模糊处理,而无需使用复杂的图像处理算法。
使用步骤:
- 设置窗口的背景模糊半径。
- 控制模糊区域的透明度。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// 获取当前窗口
Window window = getWindow();
// 设置模糊半径
window.setBackgroundBlurRadius(20);
// 设置窗口背景的透明度
window.setDimAmount(0.5f);
}
2. 核心代码跟踪
status_t GLESRenderEngine::drawLayers(const DisplaySettings& display,
const std::vector<const LayerSettings*>& layers,
ANativeWindowBuffer* const buffer,
const bool useFramebufferCache, base::unique_fd&& bufferFence,
base::unique_fd* drawFence) {
。。。
// Gathering layers that requested blur, we'll need them to decide when to render to an
// offscreen buffer, and when to render to the native buffer.
std::deque<const LayerSettings*> blurLayers;
if (CC_LIKELY(mBlurFilter != nullptr)) {
for (auto layer : layers) {
if (layer->backgroundBlurRadius > 0) {