CISourceOverCompositing在设备和模拟器中产生不同的结果

时间:2012-01-22 17:25:07

标签: iphone ios ios5 core-image

我正在尝试使用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但是我必须提取掩码并增加复杂性......

2 个答案:

答案 0 :(得分:1)

在文件名和指定的文件中查找不同的大小写。它们不必是在模拟器中工作的相同情况,但它们在设备上区分大小写。这让我失去了很多次,如果你不寻找,很难找到它。

答案 1 :(得分:1)

好的,我发现了这个问题,这有点棘手。首先,为了回答Jeshua,生成了面具和基础,因此这里的路径不相关(但我会牢记这一点,最好知道)。

现在为“解决方案”。生成掩码时,我在背景上下文(CGImageCreateWithMask,...)上使用了CG *调用的组合。现在,似乎这些调用的结果给了我CGImage看似没有alpha通道(CGImageGetAlphaInfo返回0)但是......在设备上和模拟器AND CoreImage API中的CoreGraphics API,但仅在模拟器应用仍然存在的alpha通道。

使用kCGImageAlphaPremultipliedLast创建CGContext并使用CGContextDrawImagekCGBlendModeSourceOut(或任何你需要“掏空”你的图像)保持alpha通道完好无损,这适用于模拟器和设备。

我会提供雷达作为模拟器或设备错误。