【发布时间】:2019-11-12 19:48:31
【问题描述】:
我正在尝试使用专门的 CIImage 过滤器来获得类似于颜色蒙版的东西。
基本上,我希望使所有黑色像素都透明。我不介意所有非黑色像素最终具有什么颜色,只要它们具有最大 alpha。
我在 Core Graphics 中熟悉的用于实现此目的的代码如下所示:
// Convert black sections to transparent using a color mask
const CGFloat maskingColors[6] = { 0, 0, 0, 0, 0, 0 };
CGImageRef result = CGImageCreateWithMaskingColors(image, maskingColors);
我已经使用颜色矩阵滤镜在 Core Image 中对其进行了拍摄,但它只是将 result 设置为 nil,因为 CIVector 值大于 1.0f。
// Create color matrix filter
CIFilter *matrix = [CIFilter filterWithName:@"CIColorMatrix"];
// Set filter properties
[matrix setValue:image forKey:kCIInputImageKey];
[matrix setValue:[CIVector vectorWithX:1.0f Y:0.0f Z:0.0f W:0.0f] forKey:@"inputRVector"];
[matrix setValue:[CIVector vectorWithX:0.0f Y:1.0f Z:0.0f W:0.0f] forKey:@"inputGVector"];
[matrix setValue:[CIVector vectorWithX:0.0f Y:0.0f Z:1.0f W:0.0f] forKey:@"inputBVector"];
[matrix setValue:[CIVector vectorWithX:255.0f Y:255.0f Z:255.0f W:0.0f] forKey:@"inputAVector"];
// Get the mapped image
CIImage *result = [matrix valueForKey:kCIOutputImageKey];
注意:不管怎样,这是一个 OSX 应用程序。
【问题讨论】:
-
您需要一个简单的解决方案还是最快的解决方案?我曾经遇到过这样的问题,我建议你使用 openGL 进行快速图像重绘,因为你不能只在上面绘制透明像素。
-
目前是简单的解决方案,但如果您有关于 OpenGL 的提示,那也很好。理想情况下,在这个问题的范围内,我们应该将所有内容都保留在 CIImage 中(以帮助其他人)。
-
你看过
CIFilterCIMaskToAlpha或CIColorMap吗? -
CIMaskToAlpha如果我们能以严格的纯黑/白(无灰色)获得原始图像,则将起作用。对如何编码的建议持开放态度。CIColorMap映射到我认为在这种情况下没有帮助的渐变。 -
您是否可以选择使用自定义 CIFilter?