2012-09-12 9 views
10

Ho trovatoiOS: creare una versione più scura di UIImage e lasciare invariati i pixel trasparenti?

Create new UIImage by adding shadow to existing UIImage

e

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

Ma le risposte selezionate non funzionano per me.

ho un UIImage, che può avere alcuni pixel trasparenti in esso, ho bisogno di creare un nuovo UIImage con pixel non trasparenti oscurato, non v'è alcun modo per fare questo? Stavo pensando di usare UIBezierPath ma non so come farlo solo per i pixel non trasparenti.

risposta

31

Questa è la classe che uso per colorare le immagini anche se sono trasparenti.

+ (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; 
} 

Per scurire l'immagine si passa al metodo UIColor nero o grigio con trasparenza ridotta.

+6

Grazie! Miglioramento suggerito: Usa 'UIGraphicsBeginImageContextWithOptions (image.size, NO, image.scale)' per mantenere la scala, altrimenti l'immagine colorata sarebbe sfocata sui display Retina. – Merott

+2

@Merott Vado avanti e modifica la risposta per includere il tuo suggerimento. Potrebbe essere il moderatore respinto, ma se i PO sono felici, si spera che lo correggano di nuovo. – Benjohn

+0

Questo è molto utile. Grazie! – birdcage

13

Cosa ne pensi di provare un filtro CoreImage?

È possibile utilizzare il filtro CIColorControls per regolare la luminosità e il contrasto dell'input per scurire l'immagine.

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

Per saperne di più sui parametri CIFilter qui:

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

+0

Bella soluzione, ma nota che richiede iOS 5 – Adam

+0

Inoltre, il tuo codice ha una perdita di memoria importante (createCGImage deve essere rilasciato!), E (per me) non funziona - dove la risposta accettata funziona perfettamente. – Adam

4

Ecco una versione rapida Swift, utilizzando 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. 
Problemi correlati