2013-07-30 2 views
1

Какова реальная разница между:GPUImage: imageFromCurrentlyProcessedOutputWithOrientation против imageByFilteringImage:

[GPUImageFilter imageFromCurrentlyProcessedOutputWithOrientation]

и [GPUImageFilter imageByFilteringImage:]

... в сторону от imageByFilteringImage требуя NSImage *?

Есть ли разница в скорости? С помощью imageByFilterImage вы можете настроить фильтры как «конвейер», которые вы можете повторно использовать или что-то в этом роде? Или вы должны использовать imageFromCurrentlyProcessedOutputWithOrientation для работы с BlendFilters (которые принимают несколько входов изображения)?

Я понимаю, что если вы используете imageFromCurrentlyProcessedOutputWithOrientation, вам нужно создать новый фильтр каждый раз, когда вы хотите обработать новое изображение. Это верно?

ответ

4

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

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter]; 

[self prepareForImageCapture]; 

[stillImageSource addTarget:(id<GPUImageInput>)self]; 
[stillImageSource processImage]; 

CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation]; 

[stillImageSource removeTarget:(id<GPUImageInput>)self]; 
return processedImage; 

-imageByFilteringImage: эффективно использует -imageFromCurrentlyProcessedOutputWithOrientation: (в действительности, его CGImage) внутри него.

Что он делает, это требуется в UIImage или NSImage (iOS или Mac), создает из него временный экземпляр GPUImagePicture, строит цепочку фильтров от этого к текущему фильтру, настраивает его для более быстрого захвата изображения с использованием -prepareForImageCapture, обрабатывает изображение и, наконец, извлекает результат через -newCGImageFromCurrentlyProcessedOutputWithOrientation:.

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

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

-prepareForImageCapture также имеет некоторые побочные эффекты. Хотя это значительно сокращает использование памяти и улучшает скорость извлечения изображений, создавая карту памяти между выходной текстурой фильтра и локальным буфером пикселей, это сопоставление блокирует фильтр, чтобы он не мог обработать что-либо еще до освобождения извлеченного UIImage. Если вы создаете цепочку фильтров вручную, вы можете не использовать этот вызов.

+0

Это потрясающе, спасибо Брэд! Приятно видеть вас здесь. Я продолжаю забывать, что GPUImage является открытым исходным кодом, и я могу щелкнуть в любом месте! Благодарим вас за подробный ответ. –

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