我正在尝试使用CISourceOverCompositing
过滤器,但我正在撞墙。
这是相关代码。 mask是UIImage
,images是UIImage
ci_mask = [[CIImage alloc] initWithCGImage: mask.CGImage];
ctx = [CIContext contextWithOptions: nil];
compo = [CIFilter filterWithName: @"CISourceOverCompositing"];
for(int i = 0; i < images.count; i++) {
UIImage *image = [images objectAtIndex: i];
ci_base = [[CIImage alloc] initWithCGImage: image.CGImage];
[compo setDefaults];
[compo setValue: ci_mask forKey: @"inputImage"];
[compo setValue: ci_base forKey: @"inputBackgroundImage"];
result = compo.outputImage;
CGImageDestinationAddImage(
dst_ref,
[ctx createCGImage: result fromRect:result.extent],
frame_props
);
}
mask
包含一个alpha通道,可以在模拟器中正确应用,但不能在设备上应用。输出仅显示掩模,看起来似乎没有使用alpha通道来混合图像。
使用CoreGraphics API的几乎相同的代码工作正常(但我不能应用其他CIF过滤器)
我可能会尝试使用CIBlendWithMask
但是我必须提取掩码并增加复杂性......
答案 0 :(得分:1)
在文件名和指定的文件中查找不同的大小写。它们不必是在模拟器中工作的相同情况,但它们在设备上区分大小写。这让我失去了很多次,如果你不寻找,很难找到它。
答案 1 :(得分:1)
好的,我发现了这个问题,这有点棘手。首先,为了回答Jeshua,生成了面具和基础,因此这里的路径不相关(但我会牢记这一点,最好知道)。
现在为“解决方案”。生成掩码时,我在背景上下文(CGImageCreateWithMask
,...)上使用了CG *调用的组合。现在,似乎这些调用的结果给了我CGImage
看似没有alpha通道(CGImageGetAlphaInfo
返回0)但是......在设备上和模拟器AND CoreImage API中的CoreGraphics API,但仅在模拟器应用仍然存在的alpha通道。
使用kCGImageAlphaPremultipliedLast
创建CGContext并使用CGContextDrawImage
和kCGBlendModeSourceOut
(或任何你需要“掏空”你的图像)保持alpha通道完好无损,这适用于模拟器和设备。
我会提供雷达作为模拟器或设备错误。