Одна из приятных особенностей библиотеки с открытым исходным кодом заключается в том, что мы можем изучить код, лежащий в основе этих методов. Это немного сложнее, чем раньше, потому что она была распространена на общий случай 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. Если вы создаете цепочку фильтров вручную, вы можете не использовать этот вызов.
Это потрясающе, спасибо Брэд! Приятно видеть вас здесь. Я продолжаю забывать, что GPUImage является открытым исходным кодом, и я могу щелкнуть в любом месте! Благодарим вас за подробный ответ. –