J'essaye de changer la couleur de UIImage. Mon 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;
}
Ce code fonctionne, mais l'image obtenue n'est pas aussi bonne qu'elle devrait l'être: les pixels limites de l'image renvoyée sont intermittents et pas aussi lisses que dans ma première image. Comment puis-je résoudre ce problème?
Réponses:
Depuis iOS 7, c'est le moyen le plus simple de le faire.
Objectif c:
Swift 2.0:
Swift 4.0:
Storyboard:
Configurez d'abord l'image en tant que modèle (sur la barre de droite - Rendu en tant que) dans vos ressources. Ensuite, la couleur de l'image serait la couleur de teinte appliquée.
la source
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@Ankish merci!C'est à peu près la réponse ci-dessus, mais légèrement raccourcie. Cela ne prend l'image que comme masque et ne "multiplie" pas ou ne colore pas réellement l'image.
Objectif c:
Rapide:
la source
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
car votre version ne créera que des graphiques sans rétine.Une autre façon de teinter une image est de simplement la multiplier par une couleur constante. Parfois, cela est préférable car cela ne «soulève» pas les valeurs de couleur dans les zones noires; il garde les mêmes intensités relatives dans l'image. L'utilisation d'une superposition comme teinte a tendance à aplatir le contraste.
Voici le code que j'utilise:
Version Swift
la source
Dans Swift 3.0
Dans Swift 2.0
Profitez de vos pionniers Swift
la source
Solution Swift 4.2
la source
À partir d' iOS 10, vous pouvez utiliser
UIGraphicsImageRenderer
:la source
Si vous n'avez pas à le faire par programme, vous pouvez simplement le faire à l'aide de Xcode UI.
Si vous accédez à l'image dans votre dossier de ressources d'image, ouvrez l'inspecteur sur le côté droit et il y a une liste déroulante "Rendre en tant que" avec les options suivantes:
Une fois que vous avez sélectionné le modèle, vous pouvez modifier la teinteColor de l'image comme vous le souhaitez, que ce soit en utilisant l'interface utilisateur du storyboard Xcode ou par programme.
Voir cette image:
la source
Voici mon adaptation de la réponse de @ Anna. Deux points clés ici:
destinationIn
mode de fusionUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
pour obtenir une image fluideCoder dans Swift 3 :
la source
self
dans votre méthode et supprimer le paramètre d'image inutileBasez-vous sur la réponse de @ Anna et je réécris pour swift 2.2 et gère l'image avec un canal alpha:
la source
Le code d'Anna fonctionne bien pour copier une UIImage.image sur un arrière-plan .image coloré en utilisant kCGBlendModeNormal plutôt que kCGBlendModeMultiply. Par exemple,
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
placera le contenu de mainImage.image sur la teinte yourColor tout en préservant l'opacité de yourColor. Cela a résolu mon problème de placement d'une couleur d'arrière-plan avec une opacité derrière une image à enregistrer dans la pellicule.la source
Swift 3:
la source
Version Swift 3.0 du merveilleux code d'Anna:
la source
Pour iOS 13 et plus récent:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
la source