Как обесцветить 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.