2012-01-22 2 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

확인 문제가 발견되었지만 조금 까다 롭습니다. 먼저, 예슈아에게 대답하기 위해, 마스크와베이스가 모두 생성되어 경로가 여기에 관련이 없습니다 (그러나 나는 이것을 명심해야합니다.).

이제 "해결책". 마스크를 생성 할 때 배경 컨텍스트 (CGImageCreateWithMask, ...)에서 CG * 호출 조합을 사용했습니다. 이제 그 호출의 결과는 CGImage 겉보기 알파 채널 (CGImageGetAlphaInfo 반환합니다)하지만 ... 둘 다 CoreGraphics API를 장치 및 시뮬레이터 및 CoreImage API하지만 시뮬레이터에서 제공합니다 여전히 현재 알파 채널 .

kCGImageAlphaPremultipliedLast와 CGContext를 생성 및 kCGBlendModeSourceOutCGContextDrawImage를 사용

그대로 알파 채널을 유지 (또는 당신이 "밖으로 빈"이미지가 필요 무엇이든)이 시뮬레이터 및 장치 모두에서 작동합니다.

시뮬레이터 나 장치가 잘못되어있어 레이더 파일을 작성합니다.

관련 문제