2015-02-10 17 views
24

Ricevo un'immagine da un server, quindi in base a un colore scelto dall'utente, il colore dell'immagine verrà modificato.Come posso cambiare immagine tintColor

ho provato la seguente:

_sketchImageView.image = [_sketchImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
[_sketchImageView setTintColor:color]; 

ho ottenuto l'opposto del mio obiettivo (il colore bianco esterno UIImage viene colorato con il colore scelto).

cosa sta andando male?

Ho bisogno di fare lo stesso in questa domanda, la soluzione fornita non risolve il mio caso. How can I change image tintColor in iOS and WatchKit

+0

Se si desidera riempire un'immagine con un certo colore che avete bisogno soluzione più avanzata. In questo modo: https://github.com/mxcl/UIImageWithColor – orkenstein

+0

penso che sia necessario l'effetto del colore di sfondo, prova '[_sketchImageView setBackgroundColor: color]' – Saif

+0

ho provato questa soluzione prima e dà lo stesso risultato. // UIImage * img = [UIImage resizableImageWithColor: color cornerRadius: 10]; // UIImage * img = [UIImage imageWithColor: dimensione colore: CGSizeMake (20, 20)]; UIImage * img = [UIImmagine imageWithColor: color]; _sketchImageView.image = img; – user2168496

risposta

45

tenta di generare nuova immagine per voi stessi

UIImage *newImage = [_sketchImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
UIGraphicsBeginImageContextWithOptions(image.size, NO, newImage.scale); 
[yourTintColor set]; 
[newImage drawInRect:CGRectMake(0, 0, image.size.width, newImage.size.height)]; 
newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

_sketchImageView.image = newImage; 

e utilizzarlo.

Buona fortuna

UPDATE ======= =======

Questa soluzione solo cambiamento di colore di immagine tutto di pixel.

Esempio: abbiamo un'immagine libro: http://pngimg.com/upload/book_PNG2113.png

enter image description here

E dopo l'esecuzione di codice di cui sopra (exp: TintColor è rosso). Abbiamo:

enter image description here

SO: come la vostra immagine è dipende da come avete progettato

+0

Grazie mille, diciamo che ho un'immagine di un libro, questa soluzione ha colorato l'immagine fuori dai confini del libro. Voglio il contrario, cioè il libro stesso da colorare. qualche idea per quale motivo sta succedendo? – user2168496

+0

Penso che sia necessario riprogettare l'immagine del tuo libro. Ho appena modificato il mio post. Vedi, – VietHung

+0

Sì, sì .. ho provato la tua immagine e funziona bene :) apprezzo molto lo – user2168496

2

Si può provare:

_sketchImageView.image = [self imageNamed:@"imageName" withColor:[UIColor blackColor]]; 

- (UIImage *)imageNamed:(NSString *)name withColor:(UIColor *)color 
{ 
    // load the image 
    //NSString *name = @"badge.png"; 
    UIImage *img = [UIImage imageNamed:name]; 

    // begin a new image context, to draw our colored image onto 
    UIGraphicsBeginImageContext(img.size); 

    // get a reference to that context we created 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // set the fill color 
    [color setFill]; 

    // 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); 

    // set the blend mode to color burn, and the original image 
    CGContextSetBlendMode(context, kCGBlendModeColorBurn); 
    CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height); 
    CGContextDrawImage(context, rect, img.CGImage); 

    // set a mask that matches the shape of the image, then draw (color burn) a colored rectangle 
    CGContextClipToMask(context, rect, img.CGImage); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context,kCGPathFill); 

    // generate a new UIImage from the graphics context we drew onto 
    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return the color-burned image 
    return coloredImg; 
} 
+0

questo codice dà CGContextDrawImage: contesto 0x0 non valido. Questo è un errore grave. Questa applicazione, o una libreria che utilizza, utilizza un contesto non valido e contribuisce così a un degrado complessivo della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento. qualche idea? – user2168496

+0

Controlla se l'istanza UIImageView non è vuota. Se il metodo non viene chiamato contro un UIIMageView vuoto. – gabriel

+0

sì c'è un'immagine, l'immagine viene visualizzata nella vista di immagine, quindi dopo che l'utente ha selezionato il colore, voglio che il suo colore sia cambiato – user2168496

4

provare qualcosa di simile

UIImage *originalImage = _sketchImageView.image 
UIImage *newImage = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,50,50)]; // your image size 
imageView.tintColor = [UIColor redColor]; // or whatever color that has been selected 
imageView.image = newImage; 
_sketchImageView.image = imageView.image; 

Spero che questo aiuti.

+0

Grazie per l'aiuto, ma questo cambia l'immagine in immagine bianca (poiché è vuota) – user2168496

+0

Quindi stai dicendo che _sketchImageView.image è vuoto? – Gismay

+0

No, non è .. Voglio dire dopo aver applicato il codice ho ottenuto un'immagine bianca – user2168496

1

Provare a impostare il colore della tinta sulla superview della vista dell'immagine. Per esempio. [self.view setTintColor:color];

16

In Swift è possibile utilizzare questa estensione: [Sulla base di @ VietHung soluzione Objective-C]


extension UIImage { 
    func imageWithColor(color: UIColor) -> UIImage? { 
     var image = imageWithRenderingMode(.AlwaysTemplate) 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     color.set() 
     image.drawInRect(CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
     image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 
0

Ecco come applicare e utilizzare le tinte in IOS 9 con Swift.

//apply a color to an image 
//ref - http://stackoverflow.com/questions/28427935/how-can-i-change-image-tintcolor 
//ref - https://www.captechconsulting.com/blogs/ios-7-tutorial-series-tint-color-and-easy-app-theming 
func getTintedImage() -> UIImageView { 

    var image  : UIImage; 
    var imageView : UIImageView; 

    image = UIImage(named: "someAsset")!; 
    let size : CGSize = image.size; 
    let frame : CGRect = CGRectMake((UIScreen.mainScreen().bounds.width-86)/2, 600, size.width, size.height); 

    let redCover : UIView = UIView(frame: frame); 

    redCover.backgroundColor = UIColor.redColor(); 
    redCover.layer.opacity = 0.75; 

    imageView  = UIImageView(); 
    imageView.image = image.imageWithRenderingMode(UIImageRenderingMode.Automatic); 

    imageView.addSubview(redCover); 

    return imageView; 
} 
3

In Swift 3.0 è possibile utilizzare questa estensione: [basata sulla @ di VietHung soluzione Objective-C]

extension UIImage { 
    func imageWithColor(_ color: UIColor) -> UIImage? { 
     var image = imageWithRenderingMode(.alwaysTemplate) 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     color.set() 
     image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
     image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 
12

In rapida 2.0 è possibile utilizzare questo

let image = UIImage(named:"your image name")?.imageWithRenderingMode(.AlwaysTemplate) 
let yourimageView.tintColor = UIColor.redColor() 
yourimageView.image = image 

a Swift 3.0 è possibile utilizzare questo

let image = UIImage(named:"your image name")?.withRenderingMode(.alwaysTemplate) 
let yourimageView.tintColor = UIColor.red 
yourimageView.image = image 
+2

Per Swift 3.0, ti consigliamo di utilizzare withRenderingMode, non imageWithRenderingMode. – Joe

1

per SWIFT 3.0, ho fatto una sottoclasse personalizzata di UIImageView chiamato TintedUIImageView. Ora l'immagine utilizza qualsiasi colore della tinta è impostato nel costruttore di interfaccia o il codice

class TintedUIImageView: UIImageView { 

    override func awakeFromNib() { 
     if let image = self.image { 
      self.image = image.withRenderingMode(.alwaysTemplate) 
     } 
    } 
} 
+0

Benvenuti in SO! La tua risposta sembra un commento piuttosto che una risposta. Una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare] (http://stackoverflow.com/help/privileges/comment) su qualsiasi post. Controlla anche questo [cosa posso fare invece] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). Se intendevi rispondere, leggi questo [how-to-answer] (http://stackoverflow.com/help/how-to-answer) per seguire le linee guida SO. – thewaywewere

0

Una cosa si può fare è, basta aggiungere le immagini nella cartella Assets in XCode e quindi modificare la modalità di rendering di immagine Modello, così ogni volta che cambia il colore della tinta di UIImageView, cambierà automaticamente l'immagine.

controllare questo link out ->https://www.google.co.in/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwiM0YXO0ejTAhUIQ48KHfGpBpgQjRwIBw&url=https%3A%2F%2Fkrakendev.io%2Fblog%2F4-xcode-asset-catalog-secrets-you-need-to-know&psig=AFQjCNGnAzVn92pCqM8612o1R0J9q1y7cw&ust=1494619445516498

Problemi correlati