Si vous avez une image en niveaux de gris et souhaitez devenir blanc la teinte de couleur, kCGBlendModeMultiply
est le chemin à parcourir. Avec cette méthode, vous ne pouvez pas avoir faits saillants plus claire que votre teinte de couleur.
Au contraire, si vous disposez soit d'une non-image en niveaux de gris, OU que vous avez faits saillants et les ombres qui doit être préservé, le mode de fusion kCGBlendModeColor
est le chemin à parcourir. Le blanc va rester blanc et noir va rester noir comme la luminosité de l'image est préservée. Ce mode est faite pour teinter - c'est la même que Photoshop Color
mode de fusion des calques (avertissement: légèrement différents résultats peuvent se produire).
Notez que la teinture alpha-pixels ne fonctionne pas correctement ni iOS, ni dans Photoshop - demi-transparents les pixels noirs ne voudrais pas rester noir. J'ai mis à jour la réponse ci-dessous pour contourner ce problème, il a fallu un temps assez long à trouver.
Vous pouvez également utiliser l'un des modes de fusion kCGBlendModeSourceIn/DestinationIn
au lieu de CGContextClipToMask
.
Si vous souhaitez créer un UIImage
, des sections de code peut être entouré par le code suivant:
UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, [[UIScreen mainScreen] scale]); // for correct resolution on retina, thanks @MobileVet
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);
// image drawing code here
UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Voici donc le code pour colorer une image transparente avec kCGBlendModeColor
:
// draw black background to preserve color of transparent pixels
CGContextSetBlendMode(context, kCGBlendModeNormal);
[[UIColor blackColor] setFill];
CGContextFillRect(context, rect);
// draw original image
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
// tint image (loosing alpha) - the luminosity of the original image is preserved
CGContextSetBlendMode(context, kCGBlendModeColor);
[tintColor setFill];
CGContextFillRect(context, rect);
// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
Si votre image n'a pas de demi-pixels transparents, vous pouvez aussi le faire dans l'autre sens avec des kCGBlendModeLuminosity
:
// draw tint color
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
// replace luminosity of background (ignoring alpha)
CGContextSetBlendMode(context, kCGBlendModeLuminosity);
CGContextDrawImage(context, rect, myIconImage.CGImage);
// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
Si vous n'avez pas de soins pour la luminosité, que vous avez juste obtenu une image avec un canal alpha qui devrait être teintées d'une couleur, vous pouvez le faire d'une façon plus efficace:
// draw tint color
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
ou l'inverse:
// draw alpha-mask
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
// draw tint color, preserving alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
Amusez-vous!