我正在尝试在iOS上的Swift中使用CIColorMatrix,我想出的结果与我对它应该如何工作的理解不符。
documentation将其定义为:
s.r = dot(s, redVector)
s.g = dot(s, greenVector)
s.b = dot(s, blueVector)
s.a = dot(s, alphaVector)
s = s + bias
所以假设我有一个RGBA值为[255,0,0,255](100%红色)的输入像素。我将向量[0.5,0,0,0]应用于红色通道。这不应该导致 127 的红色通道值?
(255*0.5)+(0*0)+(0*0)+(255*0) = 127.5
出于某种原因,使用这些值,CIColorMatrix给我的值 187 。这不是他们所谈论的dot()的定义吗?
这是一段代码片段(输入图片全部为红色)。
// Before this, the RGB values are [255, 0, 0]
let vec = CIVector(x: 0.5, y: 0, z: 0, w: 0)
let filter = CIFilter(name: "CIColorMatrix")
filter!.setDefaults()
// Default bias is [0,0,0,0] (explicitly setting it as such doesn't change the result).
filter!.setValue(myImage, forKey: kCIInputImageKey)
filter!.setValue(vec, forKey: "inputRVector")
// After this, the RGB values are [187, 0, 0]
我在这里错过或误解了什么?
答案 0 :(得分:1)
所有Core Image过滤器都在执行它们的CIContext
的工作色彩空间中运行。滤波器内核也可以使用alpha-Unsmultiplied像素值,而滤波器输出则是预乘的。如果您看到的结果与预期不符,请检查您的工作和输出颜色空间是否按照您的需要进行配置,并确保您没有使用alpha预乘法做任何有趣的事情。
答案 1 :(得分:1)
CIColorMatrix过滤器的另一个警告是它的参数应用于未预乘的颜色值。所以实际上内核的行为就像它的代码一样:
s = unpremultiply(s)
s.r = dot(s, redVector)
s.g = dot(s, greenVector)
s.b = dot(s, blueVector)
s.a = dot(s, alphaVector)
s = s + bias
s = premultiply(s)
如果你的颜色是不透明的(就像你的[255,0,0,255]的例子那样)那么预乘或/预乘没有效果。