Как обесцветить UIImage?

Есть ли простой способ (или встроенная библиотека) в iOS 5.x для обесцветения UIImage? Вот как я это делаю сейчас:

CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextTranslateCTM(context, 0.0, self.bounds.size.height); // flip image right side up
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, rect, self.image.CGImage);
    CGContextSetBlendMode(context, kCGBlendModeSaturation);
    CGContextClipToMask(context, self.bounds, image.CGImage); // restricts drawing to within alpha channel
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, desaturation);
    CGContextFillRect(context, rect);

    CGContextRestoreGState(context); // restore state to reset blend mode

Это кажется немного сложнее, чем я ожидал. Есть ли более простой способ, чем это?

Я думал о Core Image, но я не могу найти конкретный пример того, как сделать обесцвечивание изображения, используя это.

Ответ 1

Вы можете сделать это с открытым исходным кодом GPUImage с использованием двух или трех строк кода:

UIImage *inputImage = [UIImage imageNamed:@"inputimage.png"];    
GPUImageGrayscaleFilter *grayscaleFilter = [[GPUImageGrayscaleFilter alloc] init];
UIImage *grayscaleImage = [grayscaleFilter imageByFilteringImage:inputImage];

(помня о том, чтобы освободить фильтр, если он не создан с использованием ARC)

Это уменьшает изображение до значений яркости, обесцвечивая его. Если вы хотите переменную насыщенность/десатурацию, вы можете использовать GPUImageSaturationFilter. Как видно из названия фреймворка, эта фильтрация выполняется на графическом процессоре и быстрее, чем Core Image, практически в каждой ситуации, которую я тестировал на iOS с 5.1.