Вы можете сделать это довольно легко, используя GPUImage и его GPUImageSepiaFilter и GPUImageVignetteFilter:
Приведенное выше изображение было сгенерировано с использованием следующего кода:
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
GPUImageVignetteFilter *vignetteImageFilter = [[GPUImageVignetteFilter alloc] init];
vignetteImageFilter.vignetteEnd = 0.6;
vignetteImageFilter.vignetteStart = 0.4;
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter addTarget:vignetteImageFilter];
[stillImageSource processImage];
UIImage *filteredImage = [vignetteImageFilter imageFromCurrentlyProcessedOutput];
Существует также GPUImageGrayscaleFilter, если вы хотите применить фильтр оттенков серого к исходному изображению.
Как видно из названия платформы, все это ускоряется с помощью графического процессора, поэтому оно намного быстрее, чем любые связанные с процессором процедуры обработки изображений. Фактически, вы можете применить вышеупомянутые фильтры к живому видео. IPhone 4 может запустить этот фильтр за ~ 2 мс для видеокадров 640x480. Неподвижные изображения немного медленнее из-за циклического обхода Core Graphics, необходимого при переходе к UIImages и из него, но это все же в 6 раз быстрее, чем фильтры с привязкой к ЦП.
Одно предостережение в отношении текущей реализации заключается в том, что устройства не A5 (iPhone 3G S, iPhone 4, iPad 1) имеют ограничение размера текстуры 2048x2048, поэтому в настоящее время я не могу фильтровать изображения большего размера. Я работаю над тем, как преодолеть это ограничение, но в то же время вам может потребоваться уменьшить масштаб изображения, чтобы он соответствовал этому пределу разрешения перед обработкой.