2009-08-03 5 views
34

Mi piacerebbe sapere come colorare un'immagine (fare un bianco .png rosso, per esempio). Ho visto vari suggerimenti ma mai nessuna conferma che ciò sia effettivamente possibile. Ho provato questo:iPhone - Come colori un'immagine?

-(UIImage *)colorizeImage:(UIImage *)baseImage color:(UIColor *)theColor { 
    UIGraphicsBeginImageContext(baseImage.size); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height); 

    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -area.size.height); 
    CGContextSaveGState(ctx); 
    CGContextClipToMask(ctx, area, baseImage.CGImage); 
    [theColor set]; 
    CGContextFillRect(ctx, area); 
    CGContextRestoreGState(ctx); 
    CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
    CGContextDrawImage(ctx, area, baseImage.CGImage); 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

myImageView.image = [self colorizeImage:[UIImage imageNamed:@"whiteImage.png"] color:[UIColor redColor]]; 

Ma non funziona: l'immagine è ancora bianca sullo schermo.

+0

Ma cosa stai cercando di fare esattamente? Stai cercando di trasformare tutti i pixel completamente bianchi (RGB (255,255,255)) in rosso? Vuoi solo aggiungere una tinta rossa? Il tuo "whiteImage.png" è in realtà solo un grande rettangolo di tutto il bianco? – Amagrammer

+0

Sì, desidero trasformare i pixel bianchi (o grigi) in rossi. La parte trasparente del png dovrebbe rimanere trasparente. whiteImage.png non è un rettangolo bianco, ad esempio è un'immagine di un animale. –

+0

C'è una ragione particolare per cui non è possibile avere solo una versione rossa della stessa immagine, e alternare tra loro se necessario? Le immagini bicolori si comprimono molto piccole. – Amagrammer

risposta

0

Se si imposta il backgroundColor di UIImageView su [UIColor redColor], le parti del PNG originale che erano trasparenti diventeranno rosse. In alternativa, puoi provare ad aggiungere una UIView semi-trasparente con il colore di sfondo rosso come sottoview della visualizzazione di immagini. Questo aggiungerà un alone rosso alla vista che mostra l'immagine.

+1

Grazie, ma voglio colorare i pixel che sono solo presente, non l'intero rettangolo. –

0

Stai prima disegnando il colore e poi disegnando l'immagine sopra di esso. A meno che l'immagine non sia parzialmente trasparente, sarà in grado di sovrascrivere completamente il colore di sfondo. Consiglio di provare a disegnare prima l'immagine originale e quindi a disegnarla in rosso usando kCGBlendModeHue.

Non sono sicuro del motivo per cui stai sfogliando e traducendo il tuo contesto. La tua foto è sottosopra?

1

Ok, come va?

Nella fase di creazione degli asset (NON dinamicamente durante l'esecuzione dell'applicazione), invertire la combinazione di colori delle immagini. Parte che ora è bianca -> trasparente. Parte che ora è trasparente -> qualunque sia lo sfondo della pagina.

Sotto ogni immagine, posizionare una vista bianca vuota della stessa dimensione. Quando si desidera trasformare l'immagine in rosso, cambiare il colore di quella vista bianca vuota in rosso.

È fattibile?

12

modificare la modalità di fusione da moltiplicare e il codice funzionerà:

CGContextSetBlendMode(ctx, kCGBlendModeMultiply); 
+1

+1 Grazie ha funzionato per me. Prima stavo ottenendo solo il colore bianco, ora funziona bene. – HDdeveloper

1

ragazzo @geek, fatemi sapere se questo aiuta u tizio ...

// translate/flip the graphics context (for transforming from CG* coords to UI* coords) 
CGContextTranslateCTM(context, 0, img.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// sostituire "context" con UIGraphicsGetCurrentContext() o se si dispone di un'istanza del contesto corrente.

Spero che questo aiuti.

63

Fare di questa categoria UIImage. Tiene anche conto del fattore di scala con iOS 4.

- (UIImage *)imageWithOverlayColor:(UIColor *)color 
{   
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); 

    if (UIGraphicsBeginImageContextWithOptions) { 
     CGFloat imageScale = 1.0f; 
     if ([self respondsToSelector:@selector(scale)]) // The scale property is new with iOS4. 
      imageScale = self.scale; 
     UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale); 
    } 
    else { 
     UIGraphicsBeginImageContext(self.size); 
    } 

    [self drawInRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 

    CGContextSetFillColorWithColor(context, color.CGColor); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

UPDATE - versione Swift:

func imageWithColor(color: UIColor) -> UIImage { 
    let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height) 
    UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0); 
    drawInRect(rect) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetBlendMode(context, .SourceIn) 
    CGContextSetFillColorWithColor(context, color.CGColor) 
    CGContextFillRect(context, rect); 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 
+0

Grazie per questo ... esattamente ciò di cui avevo bisogno per colorare lo sfondo di una funzionalità dell'interfaccia, in base al tema scelto dall'utente. –

+0

Questo ha funzionato anche per me :) – DivineDesert

+1

+1 Grazie ha funzionato per me. Prima che stavo ottenendo solo il colore bianco, ora {CGContextSetBlendMode (ctx, kCGBlendModeMultiply);} come detto da willc2 la sua multa funzionante. – HDdeveloper

10

Come di iOS 7 è possibile colorare le immagini con un solo colore in questo modo

Objective C

UIImage *image = [UIImage imageNamed:@"myImage.png"]; 
UIImageView *imageView = [[UIImageView alloc]initWithImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; 
imageView.tintColor = [UIColor redColor]; 

Swift 3

let image = UIImage(named:"myImage.png")?.withRenderingMode(.alwaysTemplate) 
let imageView = UIImageView(image:image) 
imageView.tintColor = .red 

Ciò colorare un'intera immagine con un solo colore e preservare il canale alfa.

+0

questo funziona magnificamente, grazie! –

2

Penso che il modo migliore per colorare un'immagine da iOS7 è specificando la proprietà UIImageRenderingModeAlwaysTemplate sulla vostra immagine:

myImageView.image = [[UIImage imageNamed:@"myImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

e poi colorare con la tintColor della ImageView

myImageView.tintColor = [UIColor purpleColor]; //Maybe purple is not the best choice ;) 

Penso che sia più semplice (nessuna categoria necessaria) e ovviamente ottimizzata!

Nota: se si sta utilizzando xcassets, è possibile impostare la proprietà di rendering per UIImageRenderingModeAlwaysTemplate in XCode, come in questo screenshot:

UIImageRenderingModeAlwaysTemplate in XCode

1

breve, dolce e meglio :)

- (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color

Definire UIColorFromRGB per utilizzare codici colore esadecimale, quindi chiamare semplicemente colorizeImage:withColor

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIImage *imgToColor = [UIImage imageNamed:@"myImage.png"]; 
    imgToColor = [self colorizeImage:imgToColor withColor:UIColorFromRGB(0xff00ff)]; 
    // use normal UIColor or UIColorFromRGB() for hex 
} 

- (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color 
{ 
    CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]); 
    [image drawInRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 

    CGContextSetFillColorWithColor(context, color.CGColor); 
    CGContextFillRect(context, rect); 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
Problemi correlati