Ich versuche, die Farbe von UIImage zu ändern. Mein Code:
-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
UIGraphicsBeginImageContext(firstImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[color setFill];
CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextClipToMask(context, rect, firstImage.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathElementMoveToPoint);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImg;
}
Dieser Code funktioniert, aber das erhaltene Bild ist nicht so gut wie es sein sollte: Begrenzte Pixel des zurückgegebenen Bildes sind intermittierend und nicht so glatt wie in meinem ersten Bild. Wie kann ich dieses Problem lösen?
Antworten:
Seit iOS 7 ist dies der einfachste Weg, dies zu tun.
Ziel c:
Swift 2.0:
Swift 4.0:
Storyboard:
Konfigurieren Sie zuerst das Bild als Vorlage (in der rechten Leiste - Rendern als) in Ihren Assets. Dann wäre die Farbe des Bildes die angewendete Tönungsfarbe.
quelle
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@ Ankish danke!Dies ist so ziemlich die Antwort oben, aber leicht verkürzt. Dies nimmt das Bild nur als Maske und "multipliziert" oder färbt das Bild nicht.
Ziel c:
Schnell:
quelle
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
da Ihre Version nur Nicht-Retina-Grafiken erstellt.Eine andere Möglichkeit, ein Bild zu tönen, besteht darin, es einfach mit einer konstanten Farbe zu multiplizieren. Manchmal ist dies vorzuziehen, da dadurch die Farbwerte in schwarzen Bereichen nicht "angehoben" werden. Dadurch bleiben die relativen Intensitäten im Bild gleich. Wenn Sie eine Überlagerung als Farbton verwenden, wird der Kontrast tendenziell abgeflacht.
Dies ist der Code, den ich benutze:
Schnelle Version
quelle
In Swift 3.0
In Swift 2.0
Viel Spaß Sie Swift Pioniere
quelle
Swift 4.2 Lösung
quelle
Ab iOS 10 können Sie Folgendes verwenden
UIGraphicsImageRenderer
:quelle
Wenn Sie es nicht programmgesteuert ausführen müssen, können Sie es einfach über die Xcode-Benutzeroberfläche ausführen.
Wenn Sie zu dem Bild in Ihrem Bildassets-Ordner wechseln, öffnen Sie den Inspektor auf der rechten Seite und es gibt eine Dropdown-Liste "Rendern als" mit den folgenden Optionen:
Sobald Sie die Vorlagenauswahl getroffen haben, können Sie die Farbtonfarbe des Bildes nach Belieben ändern - unabhängig davon, ob es die Xcode-Storyboard-Benutzeroberfläche verwendet oder programmgesteuert.
Siehe dieses Bild:
quelle
Hier ist meine Anpassung von @ Annas Antwort. Zwei wichtige Punkte hier:
destinationIn
MischmodusUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
an, um ein flüssiges Bild zu erhaltenCode in Swift 3 :
quelle
self
innerhalb Ihrer Methode verwenden und den unnötigen Bildparameter entfernenBasierend auf @ Annas Antwort schreibe ich für Swift 2.2 um und behandle das Bild mit dem Alphakanal:
quelle
Annas Code eignet sich gut zum Kopieren eines UIImage.image über einen farbigen .image-Hintergrund, indem kCGBlendModeNormal anstelle von kCGBlendModeMultiply verwendet wird. Zum Beispiel
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
wird der Inhalt von mainImage.image über den Farbton yourColor platzieren , während die Opazität yourColor erhalten. Dies löste mein Problem, eine Hintergrundfarbe mit Deckkraft hinter einem Bild zu platzieren, das auf der Kamerarolle gespeichert werden soll.quelle
Swift 3:
quelle
Schnelle 3.0-Version von Annas wunderbarem Code:
quelle
Für iOS 13 und neuer:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
quelle