2013-05-05 2 views
2

Я использую библиотеку GPUImage, и я пытаюсь объединить два изображения в реальном времени и отображать их на GPUImageView. Я пытаюсь использовать альфа-смесь обычного ввода с фильтрованной версией. Вот то, что я пытаюсь сделать:GPUImageAlphaBlendFilter обработка в реальном времени из источника GPUImageStillCamera

  ----------------->----v 
--camera--|      alpha blend ----> image view 
      -----> color filter --^ 

Я нашел некоторые сообщения об использовании смеси фильтров, но они не кажутся методы обработки в реальном времени. Я нашел https://github.com/BradLarson/GPUImage/issues/319, GPUImage: blending two images и https://github.com/BradLarson/GPUImage/issues/751 (но они либо не предназначены для обработки в реальном времени, (первый и второй), или не работает (третий).

Я попробовал почти все, но все, что я получаю, является белым изображением в GPUImageView.Если я не использую фильтр альфа-смеси, скажем, просто использую фильтр ложных цветов или что-то подобное, он отлично работает. Вот мой код:

blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; 
blendFilter.mix = 0.5; 
[blendFilter prepareForImageCapture]; 
[blendFilter addTarget:imageView]; 

passThrough = [[GPUImageFilter alloc] init]; 
[passThrough prepareForImageCapture]; 
[passThrough addTarget:blendFilter]; 

selectedFilter = [[GPUImageFalseColorFilter alloc] init]; 
[selectedFilter prepareForImageCapture]; 
[selectedFilter addTarget:blendFilter]; 

stillCamera = [[GPUImageStillCamera alloc] init]; 
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; 

[stillCamera addTarget:passThrough]; 
[stillCamera addTarget:selectedFilter]; 
[stillCamera startCameraCapture]; 

Все, что я получаю, это белый пустой экран. Если я меняю [selectedFilter addTarget:blendFilter]; на [selectedFilter addTarget:imageView];, тогда на изображении будет отображаться фильтр ложных цветов.

Кажется, что что-то не так с фильтром альфа-смеси. Я прочитал, что в некоторых сообщениях мне нужно называть processImage на входах, но эти сообщения все для ввода в реальном времени, насколько я понимаю. Как я могу заставить GPUImageAlphaBlendFilter работать в реальном времени?

ответ

2

Хорошо, исследовав проблему в Интернете и в списке выпусков проекта (https://github.com/BradLarson/GPUImage/issues) и нашел обходное решение. При установке фильтра смешивания в качестве цели мне нужно было конкретно указать индекс текстуры. По какой-то причине (вероятно, ошибка) добавление фильтра целевой смеси два раза не добавляет вторую текстуру правильно при следующем индексе. Таким образом, устанавливая индексы текстуры в явном виде 0 и 1 сделали работу:

[passThrough addTarget:blendFilter atTextureLocation:0]; 
[selectedFilter addTarget:blendFilter atTextureLocation:1]; 

Для фильтров, которые являются объектами отдельных источников, addTarget: достаточно, хотя такими, как [stillCamera addTarget:selectedFilter];.