1. GPUImageColorBalanceFilter 核心原理剖析
作为Android平台GPUImage框架中的核心色彩处理滤镜,GPUImageColorBalanceFilter实现了专业级的色彩平衡调整功能。其核心原理是通过OpenGL ES 2.0的片段着色器,在GPU端对图像的不同亮度区域(阴影/中间调/高光)进行独立的色彩偏移调整。
1.1 色彩平衡的数学基础
色彩平衡的本质是对图像RGB通道的独立调整。在数字图像处理中,每个像素的RGB值可以表示为三维向量:
code复制vec3 color = vec3(R, G, B); // 各分量范围0.0~1.0
色彩偏移操作实际上是对这个向量的线性变换:
code复制newColor = color + vec3(deltaR, deltaG, deltaB);
GPUImageColorBalanceFilter的创新之处在于,它根据像素亮度将图像划分为三个区域,分别应用不同的偏移向量:
- 阴影区域(Shadows):亮度 < 0.333
- 中间调(Midtones):0.333 ≤ 亮度 ≤ 0.667
- 高光区域(Highlights):亮度 > 0.667
1.2 区域划分的算法实现
着色器中通过以下数学公式实现区域划分:
glsl复制// 阴影区域权重计算
float shadowWeight = clamp((lightness - 0.333) / -0.25 + 0.5, 0.0, 1.0);
// 中间调区域权重计算(两个clamp相乘实现区间交集)
float midtoneWeight = clamp((lightness - 0.333)/0.25 + 0.5, 0.0, 1.0) *
clamp((lightness + 0.333 - 1.0)/-0.25 + 0.5, 0.0, 1.0);
// 高光区域权重计算
float highlightWeight = clamp((lightness + 0.333 - 1.0)/0.25 + 0.5, 0.0, 1.0);
这种设计确保了三个区域的权重函数在定义域内连续且平滑过渡,避免了调色后的图像出现明显的区域边界。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 着色器代码深度解析
2.1 颜色空间转换实现
为了实现"保留亮度"功能,着色器内置了RGB与HSL颜色空间的相互转换函数:
glsl复制// RGB转HSL
vec3 RGBToHSL(vec3 rgb) {
float maxVal = max(max(rgb.r, rgb.g), rgb.b);
float minVal = min(min(rgb.r, rgb.g), rgb.b);
float delta = maxVal - minVal;
float h = 0.0;
float s = 0.0;
float l = (maxVal + minVal) / 2.0;
if (delta != 0.0) {
s = l < 0.5 ? delta / (maxVal + minVal) : delta / (2.0 - maxVal - minVal);
if (maxVal == rgb.r) {
h = (rgb.g - rgb.b) / delta + (rgb.g < rgb.b ? 6.0 : 0.0);
} else if (maxVal == rgb.g) {
h = (rgb.b - rgb.r) / delta + 2.0;
} else {
h = (rgb.r - rgb.g) / delta + 4.0;
}
h /= 6.0;
}
return vec3(h, s, l);
}
// HSL转RGB
vec3 HSLToRGB(vec3 hsl) {
if (hsl.y == 0.0) {
return vec3(hsl.z);
}
float q = hsl.z < 0.5 ? hsl.z * (1.0 + hsl.y) : hsl.z + hsl.y - hsl.z * hsl.y;
float p = 2.0 * hsl.z - q;
vec3 rgb;
rgb.r = HueToRG
