Ich möchte ein Bild mit einer Farbreferenz tönen. Die Ergebnisse sollten wie im Mischmodus "Multiplizieren" in Photoshop aussehen, bei dem Weiß durch Farbton ersetzt wird :
Ich werde den Farbwert kontinuierlich ändern.
Follow-up: Ich würde den Code dafür in die drawRect: -Methode meines ImageView einfügen, oder?
Wie immer würde ein Code-Snippet im Gegensatz zu einem Link mein Verständnis erheblich verbessern.
Update: Unterklasse einer UIImageView mit dem von Ramin vorgeschlagenen Code .
Ich habe dies in viewDidLoad: meines View Controllers eingefügt:
[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];
Ich sehe das Bild, aber es wird nicht getönt. Ich habe auch versucht, andere Bilder zu laden, das Bild in IB festzulegen und setNeedsDisplay: in meinem View Controller aufzurufen.
Update : drawRect: wird nicht aufgerufen.
Letzte Aktualisierung:Letztes Ich habe ein altes Projekt gefunden, in dem imageView richtig eingerichtet war, damit ich Ramins Code testen konnte, und es funktioniert wie ein Zauber!
Endgültiges, endgültiges Update:
Für diejenigen unter Ihnen, die gerade etwas über Core Graphics lernen, ist hier die einfachste Sache, die möglicherweise funktionieren könnte.
In Ihrer untergeordneten UIView:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context, CGColorGetComponents([UIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1].CGColor)); // don't make color too saturated
CGContextFillRect(context, rect); // draw base
[[UIImage imageNamed:@"someImage.png"] drawInRect: rect blendMode:kCGBlendModeOverlay alpha:1.0]; // draw image
}
quelle
Antworten:
Zuerst möchten Sie UIImageView unterordnen und die drawRect-Methode überschreiben. Ihre Klasse benötigt eine UIColor-Eigenschaft (nennen wir sie overlayColor), um die Mischfarbe zu speichern, und einen benutzerdefinierten Setter, der ein Neuzeichnen erzwingt, wenn sich die Farbe ändert. Etwas wie das:
Bei der drawRect-Methode möchten Sie zuerst das Bild zeichnen und es dann mit einem Rechteck überlagern, das mit der gewünschten Farbe gefüllt ist, zusammen mit dem richtigen Mischmodus.
Um die Zeichnung zu optimieren, beschränken Sie die eigentliche Zeichnung normalerweise nur auf den Bereich, der an drawRect übergeben wurde. Da das Hintergrundbild jedoch jedes Mal neu gezeichnet werden muss, wenn sich die Farbe ändert, muss das Ganze wahrscheinlich aktualisiert werden.
Um es zu verwenden, erstellen Sie eine Instanz des Objekts und setzen Sie die
image
Eigenschaft (von UIImageView geerbt) auf das Bild undoverlayColor
einen UIColor-Wert (die Mischungsstufen können durch Ändern des Alpha-Werts der Farbe angepasst werden, die Sie weitergeben).quelle
In iOS7 haben sie die Eigenschaft tintColor in UIImageView und renderingMode in UIImage eingeführt. Um ein UIImage unter iOS7 zu tönen, müssen Sie lediglich Folgendes tun:
quelle
Ich wollte ein Bild mit Alpha tönen und habe die folgende Klasse erstellt. Bitte lassen Sie mich wissen, wenn Sie Probleme damit haben.
Ich habe meine Klasse benannt
CSTintedImageView
und sie erbt vonUIView
daUIImageView
ruft diedrawRect:
Methode nicht auf, wie in früheren Antworten erwähnt. Ich habe einen bestimmten Initialisierer eingestellt, der dem im ähneltUIImageView
Klasse .Verwendung:
CSTintedImageView.h
CSTintedImageView.m
quelle
Nur eine kurze Klarstellung (nach einigen Recherchen zu diesem Thema). Das Apple-Dokument hier stellt klar fest, dass:
Verschwenden Sie also nicht einmal Zeit damit, diese Methode in einer
UIImageView
Unterklasse zu überschreiben . Beginnen SieUIView
stattdessen mit.quelle
Dies kann sehr nützlich sein: PhotoshopFramework ist eine leistungsstarke Bibliothek zum Bearbeiten von Bildern in Objective-C. Dies wurde entwickelt, um die gleichen Funktionen bereitzustellen, mit denen Adobe Photoshop-Benutzer vertraut sind. Beispiele: Stellen Sie Farben mit RGB 0-255 ein, wenden Sie Mischfilter, Transformationen ...
Ist Open Source, hier ist der Projektlink: https://sourceforge.net/projects/photoshopframew/
quelle
quelle
Hier ist eine andere Möglichkeit, das Abtönen von Bildern zu implementieren, insbesondere wenn Sie QuartzCore bereits für etwas anderes verwenden. Dies war meine Antwort auf eine ähnliche Frage .
Import QuartzCore:
Erstellen Sie eine transparente CALayer und fügen Sie sie als Unterschicht für das Bild hinzu, das Sie tönen möchten:
Fügen Sie QuartzCore zu Ihrer Projekt-Framework-Liste hinzu (falls es noch nicht vorhanden ist), andernfalls werden folgende Compilerfehler angezeigt:
quelle
Wenn Sie versuchen, eine UIImageView-Klasse zu unterklassifizieren und bei "drawRect: wird nicht aufgerufen" hängen bleiben, sollten Sie stattdessen eine UIView-Klasse unterordnen, da für UIImageView-Klassen die Methode "drawRect:" nicht aufgerufen wird. Lesen Sie hier mehr: drawRect wird in meiner Unterklasse von UIImageView nicht aufgerufen
quelle
Das einzige, was ich mir vorstellen kann, wäre, eine rechteckige, größtenteils transparente Ansicht mit der gewünschten Farbe zu erstellen und sie über Ihre Bildansicht zu legen, indem Sie sie als Unteransicht hinzufügen. Ich bin mir nicht sicher, ob dies das Bild wirklich so tönen wird, wie Sie es sich vorstellen. Ich bin mir nicht sicher, wie Sie sich in ein Bild hacken und bestimmte Farben selektiv durch andere ersetzen würden ... klingt für mich ziemlich ehrgeizig.
Beispielsweise:
Dokumentation für UIColor:
quelle
Möglicherweise möchten Sie auch das zusammengesetzte Bild für die Leistung zwischenspeichern und es einfach in drawRect: rendern. Aktualisieren Sie es dann, wenn ein fehlerhaftes Flag tatsächlich fehlerhaft ist. Während Sie es häufig ändern, kann es Fälle geben, in denen Zeichnungen eingehen und Sie nicht schmutzig sind, sodass Sie einfach aus dem Cache aktualisieren können. Wenn Speicher mehr ein Problem als Leistung ist, können Sie dies ignorieren :)
quelle
Ich habe eine Open-Source-Bibliothek dafür: ios-image-filter
quelle
Für Swift 2.0
quelle
Zu diesem Zweck habe ich Makros erstellt:
Zur Verwendung rufen Sie einfach an:
Wenn Sie den Farbton entfernen, rufen Sie einfach an:
quelle