2012-09-12 13 views
10

He encontradoiOS: ¿cree una versión más oscura de UIImage y deje los píxeles transparentes sin cambios?

Create new UIImage by adding shadow to existing UIImage

y

UIImage, is there an easy way to make it darker or all black

Pero las respuestas seleccionadas no trabajo para mí.

Tengo un UIImage, que puede tener algunos píxeles transparentes, necesito crear un nuevo UIImage con píxeles no transparentes oscurecidos, ¿hay alguna manera de hacerlo? Estaba pensando en utilizar UIBezierPath, pero no sé cómo hacerlo solo para píxeles no transparentes.

Respuesta

31

Esta es la clase que utilizo para colorear imágenes, incluso si son transparentes.

+ (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color { 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect area = CGRectMake(0, 0, image.size.width, image.size.height); 

    CGContextScaleCTM(context, 1, -1); 
    CGContextTranslateCTM(context, 0, -area.size.height); 

    CGContextSaveGState(context); 
    CGContextClipToMask(context, area, image.CGImage); 

    [color set]; 
    CGContextFillRect(context, area); 

    CGContextRestoreGState(context); 

    CGContextSetBlendMode(context, kCGBlendModeMultiply); 

    CGContextDrawImage(context, area, image.CGImage); 

    UIImage *colorizedImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return colorizedImage; 
} 

Para oscurecer la imagen, pasará el método de UIColor negro o gris con transparencia reducida.

+6

Gracias! Mejora sugerida: Use 'UIGraphicsBeginImageContextWithOptions (image.size, NO, image.scale)' para retener la escala; de lo contrario, la imagen coloreada se vería borrosa en las pantallas Retina. – Merott

+2

@Merott Voy a seguir adelante y editar la respuesta para incluir su sugerencia. Puede ser un moderador rechazado, pero si los OP están contentos, con suerte lo volverán a aplicar. – Benjohn

+0

Esto es muy útil. ¡Gracias! – birdcage

13

¿Qué tal si probamos un filtro CoreImage?

Puede usar el filtro CIColorControls para ajustar el brillo y el contraste de entrada para oscurecer la imagen.

CIContext *context = [CIContext contextWithOptions:nil]; 
CIImage *inputImage = [[CIImage alloc] initWithImage:sourceImage]; //your input image 

CIFilter *filter= [CIFilter filterWithName:@"CIColorControls"]; 
[filter setValue:inputImage forKey:@"inputImage"]; 
[filter setValue:[NSNumber numberWithFloat:0.5] forKey:@"inputBrightness"]; 

// Your output image 
UIImage *outputImage = [UIImage imageWithCGImage:[context createCGImage:filter.outputImage fromRect:filter.outputImage.extent]]; 

Leer más acerca de los parámetros CIFilter aquí:

http://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html%23//apple_ref/doc/filter/ci/CIColorControls

+0

Buena solución, pero tenga en cuenta que requiere iOS 5 – Adam

+0

Además, su código tiene una fuga de memoria importante (¡createCGImage debe ser liberado!), Y (para mí) no funciona, donde la respuesta aceptada funciona perfectamente. – Adam

4

Aquí hay una versión Swift rápida, utilizando un CIExposureAdjust CIFilter :)

// Get the original image and set up the CIExposureAdjust filter 
    guard let originalImage = UIImage(named: "myImage"), 
    let inputImage = CIImage(image: originalImage), 
    let filter = CIFilter(name: "CIExposureAdjust") else { return } 

    // The inputEV value on the CIFilter adjusts exposure (negative values darken, positive values brighten) 
    filter.setValue(inputImage, forKey: "inputImage") 
    filter.setValue(-2.0, forKey: "inputEV") 

    // Break early if the filter was not a success (.outputImage is optional in Swift) 
    guard let filteredImage = filter.outputImage else { return } 

    let context = CIContext(options: nil) 
    let outputImage = UIImage(CGImage: context.createCGImage(filteredImage, fromRect: filteredImage.extent)) 

    myImageView.image = outputImage // use the filtered UIImage as required. 
Cuestiones relacionadas