Как вы говорите, текущие возможности Core Image на iOS немного ограничены. В частности, нехватка пользовательских ядер, которые вы найдете на рабочем столе, разочаровывает. Другие альтернативы, которые вы перечисляете (за исключением GLImageProcessing, который не сможет выполнять такую фильтрацию), - это библиотеки с привязкой к ЦП, и они будут слишком медленными для выполнения фильтрации в реальном времени на мобильном устройстве.
Однако я могу указать вам на фреймворк с открытым исходным кодом под названием GPUImage , который я только что развернул, потому что не смог найти что-то, что позволило бы вам создавать пользовательские эффекты. Как видно из названия, GPUImage выполняет ускоренную обработку графических процессоров неподвижных изображений и видео с использованием шейдеров OpenGL ES 2.0. Вы можете написать свои собственные эффекты, используя их, так что вы сможете делать практически все, что только можете придумать. Сам фреймворк - Objective-C и имеет довольно простой интерфейс.
В качестве примера фильтра искажения, следующий шейдер (на основе кода в ответ Дэнни Пфлюгофта ) выполняет эффект «рыбий глаз»:
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
const mediump float bulgeFactor = 0.5;
void main()
{
mediump vec2 processedTextureCoordinate = textureCoordinate - vec2(0.5);
mediump float radius = processedTextureCoordinate.x * processedTextureCoordinate.x + processedTextureCoordinate.y * processedTextureCoordinate.y;
mediump vec2 distortedCoordinate = vec2(pow(radius, bulgeFactor)) * processedTextureCoordinate + vec2(0.5);
gl_FragColor = texture2D(inputImageTexture, distortedCoordinate);
}
Создает такой эффект для видеопотока:
В моих тестах GPUImage обрабатывает изображения в 4 раза быстрее, чем Core Image на iPhone 4 (в 6 раз быстрее, чем обработка с привязкой к процессору), а видео в 25 раз быстрее, чем Core Image (в 70 раз быстрее, чем на процессоре). Даже в самом худшем случае, который я мог бы бросить, он соответствует Core Image по скорости обработки.
Фреймворк все еще довольно новый, так что количество стоковых фильтров, которые у меня там сейчас, невелико, но я добавлю кучу в ближайшее время. Тем временем вы можете написать свои собственные шейдеры искажения для обработки ваших изображений, а исходный код для всего, что вы можете настроить по мере необходимости. В моем вводном посте об этом есть немного больше подробностей о том, как использовать это в своих приложениях.