2012-06-05 18 views
10

¿Existe una manera fácil (o una biblioteca incorporada) en iOS 5.x de desaturar un UIImage? Aquí está cómo lo estoy haciendo actualmente:¿Cómo desaturo un 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 

Esto parece ser un poco más complicado de lo que esperaba. ¿Hay una manera más simple que esto?

Estaba pensando en Core Image, pero parece que no puedo encontrar un ejemplo concreto sobre cómo desaturar una imagen usando eso.

+0

No estoy seguro, pero posiblemente podría intentar aplicar [CIFilter] (http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIFilter_Class/Reference/Reference.html) de [kCICategoryColorEffect] (http://developer.apple.com/library/ios/DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIFilter_Class/Reference/Reference.html#//apple_ref/doc/c_ref/kCICategoryColorEffect) tipo. Demostración rápida de cómo aplicar CIFilter: http://iazapps.wordpress.com/2012/02/01/applying-cifilter-on-image-in-an-uiimageview/ –

+0

¿cuál es su valor para la desaturación? – malhal

+0

indiekiduk, ese código aparece en más contexto en una respuesta aquí: http://stackoverflow.com/questions/1144768/how-can-i-change-the-saturation-of-an-uiimage (la desaturación es un ivar en el ejemplo). – JLundell

Respuesta

21

Usted puede hacer esto con mi código abierto GPUImage marco usando dos o tres líneas de código:

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

(recordando a liberar el filtro si no la construcción de utilizar ARC)

Esto reduce la imagen a sus valores de luminancia, lo desaturan. Si desea saturación/desaturación variable, puede utilizar un GPUImageSaturationFilter. Como indica el nombre del framework, este filtrado se ejecuta en la GPU y es más rápido que Core Image en casi todas las situaciones que he comparado en iOS a partir de 5.1.

+0

Marcando eso para más tarde! Nice – box86rowh

+0

Brad ¿Hay alguna manera de volver a saturar la imagen con los colores originales después de desaturarla? Actualmente parece un viaje de ida cuando desatura una imagen usando GPUImage. Es mantener una copia de la imagen original, la única solución? Esperaba una capa de ajuste de saturación no destructiva más Photoshop: P – Zhang

+0

@Zhang - No, si quiere la imagen original en color, necesita mantenerla, porque la información se pierde en la desaturación. Sin embargo, puede tener múltiples objetivos para sus imágenes y filtros, por lo que puede dividir una segunda ruta de procesamiento antes de realizar una desaturación. Los filtros no destructivos de Photoshop mantienen copias de la imagen original desde donde trabajar. –