Update: Hier ist ein Gist für eine Swift UIColor Erweiterung mit dem Code unten.
Wenn Sie ein Graustufenbild haben und möchten, dass Weiß zur Tönungsfarbe wird , kCGBlendModeMultiply
ist dies der richtige Weg. Mit dieser Methode können Sie keine Glanzlichter erzielen, die heller als Ihre Tönungsfarbe sind.
Im Gegenteil, wenn Sie entweder einen haben Nicht-Graustufenbild , ODER Sie Highlights und Schatten , die erhalten werden sollen, der Mischmodus kCGBlendModeColor
ist der Weg zu gehen. Weiß bleibt weiß und Schwarz bleibt schwarz, wenn die Helligkeit des Bildes erhalten bleibt. Dieser Modus dient nur zum Abtönen. Er entspricht dem Ebenenüberblendungsmodus von Photoshop Color
(Haftungsausschluss: Es können leicht abweichende Ergebnisse auftreten).
Beachten Sie, dass das Abtönen von Alpha-Pixeln weder in iOS noch in Photoshop ordnungsgemäß funktioniert - halbtransparente schwarze Pixel bleiben nicht schwarz. Ich habe die Antwort unten aktualisiert, um dieses Problem zu umgehen. Es hat ziemlich lange gedauert, es herauszufinden.
Sie können kCGBlendModeSourceIn/DestinationIn
stattdessen auch einen der Mischmodi verwenden CGContextClipToMask
.
Wenn Sie eine erstellen möchten, UIImage
kann jeder der folgenden Codeabschnitte von folgendem Code umgeben sein:
UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, myIconImage.scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, myIconImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGRect rect = CGRectMake(0, 0, myIconImage.size.width, myIconImage.size.height);
UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Hier ist der Code zum Abtönen eines transparenten Bildes mit kCGBlendModeColor
:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[[UIColor blackColor] setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeColor);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
Wenn Ihr Bild keine halbtransparenten Pixel enthält, können Sie dies auch umgekehrt tun mit kCGBlendModeLuminosity
:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeLuminosity);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
Wenn Sie sich nicht für die Leuchtkraft interessieren, da Sie nur ein Bild mit einem Alphakanal haben, das mit einer Farbe getönt werden sollte, können Sie dies effizienter tun:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
oder umgekehrt:
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
Habe Spaß!