gpt4 book ai didi

objective-c - kCGImageAlphaPremultipliedFirst 和 kCGImageAlphaFirst

转载 作者:太空狗 更新时间:2023-10-30 03:50:36 29 4
gpt4 key购买 nike

你能给我解释一下 kCGImageAlphaPremultipliedFirstkCGImageAlphaFirst 之间的区别吗? Premultiplied 在实践中是什么意思?

最佳答案

简而言之,预乘是指在表示非不透明的像素时,alpha值也会影响像素的颜色分量值。

来自 Quartz 2D 绘图指南:

For bitmaps that have an alpha component, whether the color components are already multiplied by the alpha value. Premultiplied alpha describes a source color whose components are already multiplied by an alpha value. Premultiplying speeds up the rendering of an image by eliminating an extra multiplication operation per color component. For example, in an RGB color space, rendering an image with premultiplied alpha eliminates three multiplication operations (red times alpha, green times alpha, and blue times alpha) for each pixel in the image.

顺便说一句,Pre-Multiplied 可能是 API 会强制您使用的,因为这是 Quartz 的偏好。幸运的是,转换并不可怕(有损 OTOH……)。


解释这一点的最短方式是在 float 组件中,使用范围 [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;
}

你可能也想要一些饱和度。

现在这是基本形式,可以将其重新用于其他数字表示形式。请注意,这些转换是有损的。同样,请注意不要在需要常规位图的地方传递预乘位图,反之亦然。

关于objective-c - kCGImageAlphaPremultipliedFirst 和 kCGImageAlphaFirst,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12949986/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com