如果图像包含半透明像素,则可以轻松地对其进行预处理,以使 alpha 低于某个阈值的所有像素完全透明,否则完全不透明。然后CIAreaAverage
可以应用,如问题中最初建议的那样,最后可以通过将结果的 alpha 分量乘以图像大小来计算完全不透明像素的近似数量。
对于预处理,我们可以使用一个简单的 CIColorKernel,如下所示:
half4 clampAlpha(coreimage::sample_t color) {
half4 out = half4(color);
out.a = step(half(0.99), out.a);
return out;
}
(选择您喜欢的任何阈值而不是 0.99)
要从输出中获取 alpha 分量,CIAreaAverage
我们可以执行以下操作:
let context = CIContext(options: [.workingColorSpace: NSNull(), .outputColorSpace: NSNull()])
var color: [Float] = [0, 0, 0, 0]
context.render(output,
toBitmap: &color,
rowBytes: MemoryLayout<Float>.size * 4,
bounds: CGRect(origin: .zero, size: CGSize(width: 1, height: 1)),
format: .RGBAf,
colorSpace: nil)
// color[3] contains alpha component of the result
使用这种方法,一切都在 GPU 上完成,同时利用其固有的并行性。
顺便说一句,请查看此应用程序https://apps.apple.com/us/app/filter-magic/id1594986951。它可以让你使用每一个 CoreImage 过滤器。