5

你能解释一下kCGImageAlphaPremultipliedFirst和之间的区别kCGImageAlphaFirst吗?Premultiplied在实践中意味着什么?

4

1 回答 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 回答