Je voudrais teinter une image avec une référence de couleur. Les résultats devraient ressembler au mode de fusion Multiplier dans Photoshop, où les blancs seraient remplacés par une teinte :
Je changerai la valeur de la couleur en continu.
Suivi: je mettrais le code pour faire cela dans la méthode drawRect: de mon ImageView, non?
Comme toujours, un extrait de code aiderait grandement à ma compréhension, par opposition à un lien.
Mise à jour: sous-classer une UIImageView avec le code suggéré par Ramin .
Je mets ceci dans viewDidLoad: de mon contrôleur de vue:
[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];
Je vois l'image, mais elle n'est pas teintée. J'ai également essayé de charger d'autres images, de définir l'image dans IB et d'appeler setNeedsDisplay: dans mon contrôleur de vue.
Mise à jour : drawRect: n'est pas appelé.
Dernière mise à jour: j'ai trouvé un ancien projet avec une imageView correctement configurée pour que je puisse tester le code de Ramin et cela fonctionne comme un charme!
Dernière mise à jour finale:
Pour ceux d'entre vous qui viennent juste d'apprendre les Core Graphics, voici la chose la plus simple qui pourrait éventuellement fonctionner.
Dans votre UIView sous-classée:
- (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
}
Réponses:
Vous voudrez d'abord sous-classer UIImageView et remplacer la méthode drawRect. Votre classe a besoin d'une propriété UIColor (appelons-la overlayColor) pour contenir la couleur de fusion et d'un setter personnalisé qui force un redessiner lorsque la couleur change. Quelque chose comme ça:
Dans la méthode drawRect, vous voudrez d'abord dessiner l'image, puis la superposer avec un rectangle rempli de la couleur souhaitée avec le mode de fusion approprié, quelque chose comme ceci:
Habituellement, pour optimiser le dessin, vous limiteriez le dessin réel à la seule zone transmise à drawRect, mais comme l'image d'arrière-plan doit être redessinée à chaque fois que la couleur change, il est probable que l'ensemble aura besoin d'être rafraîchi.
Pour l'utiliser, créez une instance de l'objet, puis définissez la
image
propriété (héritée de UIImageView) sur l'image etoverlayColor
sur une valeur UIColor (les niveaux de fusion peuvent être ajustés en modifiant la valeur alpha de la couleur que vous transmettez).la source
Dans iOS7, ils ont introduit la propriété tintColor sur UIImageView et renderingMode sur UIImage. Pour teinter une UIImage sur iOS7, tout ce que vous avez à faire est:
la source
Je voulais teinter une image avec alpha et j'ai créé la classe suivante. S'il vous plaît laissez-moi savoir si vous rencontrez des problèmes avec lui.
J'ai nommé ma classe
CSTintedImageView
et elle hérite deUIView
puisqueUIImageView
n'appelle pas ladrawRect:
méthode, comme mentionné dans les réponses précédentes. J'ai défini un initialiseur désigné similaire à celui trouvé dans laUIImageView
classe.Usage:
CSTintedImageView.h
CSTintedImageView.m
la source
Juste une petite clarification (après quelques recherches sur ce sujet). Le doc Apple ici indique clairement que:
alors ne perdez même pas de temps à essayer de remplacer cette méthode dans une
UIImageView
sous - classe. CommencezUIView
plutôt par.la source
Cela pourrait être très utile: PhotoshopFramework est une bibliothèque puissante pour manipuler des images sur Objective-C. Cela a été développé pour apporter les mêmes fonctionnalités que les utilisateurs d'Adobe Photoshop sont familiers. Exemples: définir les couleurs à l'aide de RVB 0-255, appliquer des fichiers de fusion, des transformations ...
Est open source, voici le lien du projet: https://sourceforge.net/projects/photoshopframew/
la source
la source
Voici une autre façon d'implémenter la teinte d'image, surtout si vous utilisez déjà QuartzCore pour autre chose. C'était ma réponse à une question similaire .
Importer QuartzCore:
Créez un CALayer transparent et ajoutez-le en tant que sous-calque pour l'image que vous souhaitez teinter:
Ajoutez QuartzCore à votre liste de projets Framework (si ce n'est déjà fait), sinon vous obtiendrez des erreurs de compilation comme celle-ci:
la source
Pour ceux d'entre vous qui essaient de sous-classer une classe UIImageView et de rester bloqués à «drawRect: is not being called», notez que vous devez sous-classer une classe UIView à la place, car pour les classes UIImageView, la méthode «drawRect:» n'est pas appelée. En savoir plus ici: drawRect n'est pas appelé dans ma sous-classe de UIImageView
la source
La seule chose à laquelle je peux penser serait de créer une vue rectangulaire principalement transparente avec la couleur souhaitée et de la placer sur votre vue d'image en l'ajoutant en tant que sous-vue. Je ne suis pas sûr que cela teinte vraiment l'image comme vous l'imaginez, je ne suis pas sûr de savoir comment vous pirateriez une image et remplaceriez sélectivement certaines couleurs par d'autres ... cela me semble assez ambitieux.
Par exemple:
Documentation pour UIColor:
la source
Vous pouvez également envisager de mettre en cache l'image composite pour les performances et de la restituer simplement dans drawRect :, puis de la mettre à jour si un indicateur sale est effectivement sale. Bien que vous puissiez le changer souvent, il peut y avoir des cas où des tirages arrivent et vous n'êtes pas sale, vous pouvez donc simplement actualiser à partir du cache. Si la mémoire est plus un problème que les performances, vous pouvez l'ignorer :)
la source
J'ai une bibliothèque que j'ai open-source pour cela: ios-image-filters
la source
Pour Swift 2.0,
la source
J'ai fait des macros à cet effet:
Pour l'utiliser, il suffit d'appeler:
Lorsque vous supprimez la teinte, appelez simplement:
la source