CISourceOverCompositing дает разные результаты на устройстве и в симуляторе - PullRequest
1 голос
/ 22 января 2012

Я пытаюсь использовать фильтр 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, работает нормально (но тогда я не могу применить другие фильтры CIF)

Я, вероятно, попробую использовать CIBlendWithMask, но тогда мне придется извлечь маску и добавить сложность ...

Ответы [ 2 ]

1 голос
/ 23 января 2012

ОК, я нашел проблему, и это немного сложно. Во-первых, чтобы ответить Иешуа, и маска, и основание генерируются, поэтому путь здесь не имеет значения (но я буду иметь это в виду, это определенно полезно знать).

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

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

Я отправлю радар, так как симулятор или устройство неправильно.

1 голос
/ 23 января 2012

Ищите различную прописную букву в ваших именах файлов и указанных файлах. Они не обязательно должны быть одинаковыми, чтобы работать в симуляторе, но они чувствительны к регистру на устройстве. Это сбивало меня с толку много раз, и если вы не ищете, его довольно сложно отследить.

...