iOS: crea una versión más oscura de UIImage y deja los píxeles transparentes sin cambios?

encontré

Cree un nuevo UIImage agregando sombra a UIImage existente

y

UIImage, ¿hay una manera fácil de hacerlo más oscuro o negro?

Pero las respuestas seleccionadas no funcionan 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 forma de hacerlo? Estaba pensando en usar UIBezierPath, pero no sé cómo hacerlo solo para píxeles no transparentes.

Esta es la class que uso 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 image, pasaría el método una UIColor negra o gris con transparencia networkingucida.

¿Qué hay de probar un filter CoreImage?

Puede usar el filter CIColorControls para ajustar el brillo de input y el contraste para oscurecer la image.

 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]]; 

Lea más acerca de los parameters CIFilter aquí:

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

Aquí hay una versión rápida de Swift, usando 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 filtenetworkingImage = filter.outputImage else { return } let context = CIContext(options: nil) let outputImage = UIImage(CGImage: context.createCGImage(filtenetworkingImage, fromRect: filtenetworkingImage.extent)) myImageView.image = outputImage // use the filtenetworking UIImage as requinetworking.