你能解释一下kCGImageAlphaPremultipliedFirst
和之间的区别kCGImageAlphaFirst
吗?Premultiplied
在实践中意味着什么?
问问题
2497 次
1 回答
7
简而言之,预乘意味着当表示一个不透明的像素时,alpha 值也会影响像素的颜色分量值。
来自 Quartz 2D 绘图指南:
对于具有 alpha 分量的位图,颜色分量是否已经乘以 alpha 值。预乘 alpha 描述了其分量已经乘以 alpha 值的源颜色。预乘通过消除每个颜色分量的额外乘法运算来加速图像的渲染。例如,在 RGB 颜色空间中,使用预乘 alpha 渲染图像会消除图像中每个像素的三个乘法运算(红色乘 alpha、绿色乘 alpha 和蓝色乘 alpha)。
顺便说一句,预乘可能是 API 会强制您使用的,因为这是 Quartz 的偏好。幸运的是,转换并不可怕(有损 OTOH……)。
解释这一点的最短方法是在float
组件中,使用 range [0...1]
。
如果我们的 RGBA 输入表示是:
typedef struct t_rgba { float r,g,b,a; } t_rgba;
const t_rgba rgba = { 0.5, 0.5, 0.5, 0.5 };
然后预乘它:
t_rgba rgba_PreMul = rgba;
rgba_PreMul.r *= rgba_PreMul.a;
rgba_PreMul.g *= rgba_PreMul.a;
rgba_PreMul.b *= rgba_PreMul.a;
然后去预乘它:
t_rgba rgba_DePreMul = rgba_PreMul;
if (0.0 < rgba_DePreMul.a && 1.0 > rgba_DePreMul.a) {
const float ialpha = 1.0/rgba_DePreMul.a;
rgba_DePreMul.r *= ialpha;
rgba_DePreMul.g *= ialpha;
rgba_DePreMul.b *= ialpha;
}
你可能也想要一些饱和度。
现在这是基本形式,可以重新用于其他数字表示。请注意,这些转换是有损的。同样,注意不要在需要常规位图的地方传递预乘位图,反之亦然。
于 2012-10-18T08:18:07.240 回答