2012-01-22 3 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 Я нашел проблему, и это немного сложно. Во-первых, чтобы ответить на Иешуа, создаются и маска, и база, поэтому путь здесь не уместен (но я буду помнить об этом, конечно, хорошо знать).

Теперь для «решения». При создании маски я использовал комбинацию вызовов CG * в фоновом контексте (CGImageCreateWithMask, ...). Теперь кажется, что результат этих вызовов дает мне CGImage, казалось бы, без альфа-канала (CGImageGetAlphaInfo возвращает 0), но ... оба API-интерфейса CoreGraphics на устройстве и в API-интерфейсе Simulator AND CoreImage, но только в симуляторе применяет все еще присутствующий альфа-канал ,

Создание CGContext с kCGImageAlphaPremultipliedLast и использованием CGContextDrawImagekCGBlendModeSourceOut с (или все, что нужно, чтобы «выдалбливают» ваше изображение) сохраняет альфа-канал нетронутым, и это работает как на тренажере и устройства.

Я буду использовать радар в качестве симулятора или устройства.

Смежные вопросы