2015-02-10 33 views
24

ändern Ich erhalte Bild von einem Server, dann basierend auf einer vom Benutzer gewählten Farbe wird die Bildfarbe geändert.Wie kann ich Bild TintColor

Ich habe versucht, die folgenden:

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

Ich habe das Gegenteil von meinem Ziel (die weiße Farbe außerhalb UIImage ist mit der gewählten Farbe gefärbt).

was läuft schief?

Ich muss das gleiche in dieser Frage tun, löst die bereitgestellte Lösung meinen Fall nicht. How can I change image tintColor in iOS and WatchKit

+0

Wenn Sie Bild füllen wollen mit etwas Farbe Sie erweiterte Lösung benötigen. Wie folgt: https://github.com/mxcl/UIImageWithColor – orkenstein

+0

Ich denke, dass Sie den Effekt der Hintergrundfarbe benötigen, versuchen Sie '[_sketchImageView setBackgroundColor: color]' – Saif

+0

ich versuchte diese Lösung vor und es gibt das gleiche Ergebnis. // UIImage * img = [UIImage resizableImageWithColor: color cornerRadius: 10]; // UIImage * img = [UIImage imageWithColor: Farbgröße: CGSizeMake (20, 20)]; UIImage * img = [UIImage imageWithColor: color]; _sketchImageView.image = img; – user2168496

Antwort

45

Versuchen neues Bild für sich selbst

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; 

zu erzeugen und nutzen.

Viel Glück

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

Diese Lösung wird nur verfärben aller Bild des Pixels.

Beispiel: wir haben ein Buch Bild: http://pngimg.com/upload/book_PNG2113.png

enter image description here

Und nach oben Code ausgeführt wird (exp: TintColor ist RED). Wir haben:

enter image description here

SO: , wie Ihr Bild ist, hängt davon ab, wie Sie es entworfen

+0

Vielen Dank, lassen Sie uns sagen, dass ich ein Buch Bild habe, diese Lösung färbte das Bild außerhalb der Buch Grenzen .. Ich möchte das Gegenteil, d. H. Das Buch selbst gefärbt werden. eine Idee warum passiert das? – user2168496

+0

Ich denke, du musst dein Buchbild neu gestalten. Ich habe gerade meinen Beitrag bearbeitet. Sehen Sie es – VietHung

+0

Yeah.yessss .. Ich versuchte Ihr Bild und es funktioniert gut :) Ich schätze wirklich – user2168496

2

können Sie versuchen:

_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

Dieser Code gibt CGContextDrawImage: ungültiger Kontext 0x0. Dies ist ein schwerwiegender Fehler. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet einen ungültigen Kontext und trägt dadurch zu einer allgemeinen Verschlechterung der Systemstabilität und -zuverlässigkeit bei. Diese Notiz ist eine Höflichkeit: Bitte beheben Sie dieses Problem. Es wird ein fataler Fehler in einem bevorstehenden Update werden. eine Idee plz? – user2168496

+0

Überprüfen Sie, ob Ihre UIImageView-Instanz nicht leer ist. Wenn die Methode nicht gegen eine leere UIIMageView aufgerufen wird. – gabriel

+0

Ja, es gibt ein Bild, das Bild wird in der Bildansicht angezeigt, nachdem der Benutzer die Farbe ausgewählt hat, möchte ich, dass seine Farbe geändert wird – user2168496

4

so etwas wie dieses, das hilft

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; 

Hoffnung

Versuchen.

+0

Danke für die Hilfe, aber dies ändert das Bild in ein weißes Bild (wie es ein leeres ist) – user2168496

+0

Sie sagen also, dass Ihre _sketchImageView.image leer ist? – Gismay

+0

Nein, es ist nicht .. ich meine nach der Anwendung Ihres Codes habe ich ein weißes Bild – user2168496

1

Versuchen Sie, die Tönungsfarbe im Superview der Bildansicht einzustellen. Z.B. [self.view setTintColor:color];

16

In Swift Sie diese Erweiterung verwenden können: [Basierend auf @ VietHung der Objective-C-Lösung]


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

Hier ist, wie ich Tönen in IOS 9 mit Swift anwenden und verwenden.

//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 Sie diese Erweiterung verwenden können: [Basierend auf @ VietHung der Objective-C-Lösung]

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 swift 2.0 Sie können dieses verwenden,

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

in Swift 3.0 können Sie diese verwenden

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

Für Swift 3.0, sollten Sie withRenderingMode, nicht imageWithRenderingMode verwenden. – Joe

1

für Swift 3.0, machte ich eine benutzerdefinierte Unterklasse von UIImageView TintedUIImageView genannt. Jetzt verwendet das Bild, was Farbton Farbe in Interface Builder oder Code gesetzt

class TintedUIImageView: UIImageView { 

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

Willkommen bei SO! Ihre Antwort sieht eher wie ein Kommentar als eine Antwort aus. Sobald Sie genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) haben, können Sie [comment] (http://stackoverflow.com/help/privileges/comment) zu jedem Post schreiben. Überprüfen Sie auch dieses [was kann ich stattdessen tun] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). Wenn Sie beabsichtigen zu antworten, lesen Sie diese [How-to-answer] (http://stackoverflow.com/help/how-to-answer), um den SO-Richtlinien zu folgen. – thewaywewere

0

Eine Sache, die Sie tun können, nur Ihre Bilder Ordner Assets in XCode hinzufügen und dann den Rendering-Modus Bild ändern, Schablone, also, wenn Sie Ändere die Tönungsfarbe von UIImageView, es wird automatisch zum Bild wechseln.

prüfen Link aus ->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