Как вы можете применить искажения к UIImage, используя OpenGL ES? - PullRequest
4 голосов
/ 27 марта 2012

Есть ли способ создания эффектов, таких как вмятины, защемление, скручивание, сжатие и т. Д. На UIImage с использованием OpenGL ES, как в приложении для iPhone PhotoTwist ?

Есть ли какие-либо ссылкиили руководящие принципы для этого?Я не хочу код, просто справка о том, как это сделать.

Ответы [ 2 ]

15 голосов
/ 28 марта 2012

Самый эффективный способ обработки изображений такого типа - использовать шейдеры OpenGL ES 2.0. Еще раз, если я могу указать вам на мой GPUImage каркас, он может выполнять многие операции искажения, которые вы описываете. Для тех, кто отсутствует, вы можете написать свои собственные фрагменты шейдеров.

У меня есть эффекты выпуклого выпуклого искажения (с помощью GPUImageBulgeDistortionFilter):

Bulge distortion

вогнутое искажение (с использованием инвертированного параметра масштаба к предыдущему фильтру):

Concave distortion

искажение вихря (с использованием GPUImageSwirlFilter):

Swirl distortion

и, наконец, пинч-искажение (с использованием GPUImagePinchDistortionFilter):

Pinch distortion

Если вы посмотрите на шейдеры, используемые для каждого из фильтров, вы обнаружите, что математика очень похожа между ними. Вы должны быть в состоянии настроить его для создания собственных пользовательских эффектов из этой же базы.

Довольно легко применить эти фильтры к UIImages. Если у вас есть только один фильтр, который вы хотите использовать, вы можете сделать что-то вроде следующего:

UIImage *inputImage = [UIImage imageNamed:@"test.jpg"];
GPUImageBulgeDistortionFilter *stillImageFilter = [[GPUImageBulgeDistortionFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter imageByFilteringImage:inputImage];

Это создаст UIImage с диска, использует OpenGL ES для его фильтрации и вернет отфильтрованный UIImage для работы с вами. Вы можете использовать GPUImagePicture и пользовательский конвейер фильтрации, если вы хотите выполнять более сложные цепочечные эффекты, или вы можете использовать другой источник входного сигнала для фильтрации видео или фильмов с камеры в реальном времени.

Исходный код этого проекта доступен по вышеуказанной ссылке под лицензией BSD, так что вы можете изучить его, чтобы узнать, как передавать данные в OpenGL ES и из него и как выполнять эти виды фильтров.

0 голосов
/ 21 октября 2015

Пример кода Расширения редактирования фотографий из Apple Developer Connection делает именно эту вещь.

...