2012-01-22 11 views
0

CISourceOverCompositingフィルタを使用しようとしていますが、壁にぶつかっています。CISourceOverCompositingはデバイスとシミュレータで異なる結果を生成します

これは関連するコードです。マスクは、UIImageと画像である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のアレイが正しくシミュレータではなく、デバイスに適用されるアルファチャネルを含んでいます。出力には、アルファチャンネルを使用してイメージをブレンドすることなく、一見マスクが表示されます。

CoreGraphicsのAPIを使用して、ほぼ同じコードが正常に動作します(しかし、その後、私は他のCIFiltersを適用することはできません)

私はおそらくCIBlendWithMaskを使用しようとするでしょうが、その後、私はマスクを抽出し、複雑さを追加する必要があります。 ..

答えて

1

ファイル名と指定されたファイルで異なる大文字と小文字を探します。それらはシミュレータで動作するのと同じケースである必要はありませんが、デバイスでは大文字と小文字が区別されます。これは何度も私を捨ててしまいました。あなたが探していなければ、それを追跡することは非常に困難です。

1

OK問題が見つかりました。それはちょっと難しいです。最初に、ジェシュアに答えるために、マスクとベースの両方が生成されますので、パスはここでは関係ありません(しかし、私はそれを念頭に置いて、知っておくとよいでしょう)。

「解決策」はここをクリックしてください。マスクを生成するとき、背景コンテキスト(CGImageCreateWithMask、...)でCG *呼び出しの組み合わせを使用しました。さて、これらの呼び出しの結果、私はCGImageのアルファチャンネル(CGImageGetAlphaInfoが0を返します)がなくなりましたが、...デバイスとシミュレータのCoreGraphics APIとCoreImage APIの両方がシミュレータでのみ表示されます。

kCGImageAlphaPremultipliedLastでCGContextの作成とkCGBlendModeSourceOutCGContextDrawImageを使用して(または、あなたのイメージを「アウト中空」必要があるものは何でも)は、無傷のアルファチャンネルを保持し、これは、シミュレータとデバイスの両方で動作します。

シミュレータまたはデバイスのいずれかが間違っているため、レーダーをファイルします。

関連する問題