- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
你能给我解释一下 kCGImageAlphaPremultipliedFirst
和 kCGImageAlphaFirst
之间的区别吗? 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/
你能给我解释一下 kCGImageAlphaPremultipliedFirst 和 kCGImageAlphaFirst 之间的区别吗? Premultiplied 在实践中是什么意思? 最佳答案
我是一名优秀的程序员,十分优秀!