Самый эффективный способ обработки изображений такого типа - использовать шейдеры OpenGL ES 2.0. Еще раз, если я могу указать вам на мой GPUImage каркас, он может выполнять многие операции искажения, которые вы описываете. Для тех, кто отсутствует, вы можете написать свои собственные фрагменты шейдеров.
У меня есть эффекты выпуклого выпуклого искажения (с помощью GPUImageBulgeDistortionFilter):
вогнутое искажение (с использованием инвертированного параметра масштаба к предыдущему фильтру):
искажение вихря (с использованием GPUImageSwirlFilter):
и, наконец, пинч-искажение (с использованием GPUImagePinchDistortionFilter):
Если вы посмотрите на шейдеры, используемые для каждого из фильтров, вы обнаружите, что математика очень похожа между ними. Вы должны быть в состоянии настроить его для создания собственных пользовательских эффектов из этой же базы.
Довольно легко применить эти фильтры к 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 и из него и как выполнять эти виды фильтров.