87 votes

Comment pourrais-je teindre une image par programme sur l'iPhone?

Je voudrais teinter une image avec une couleur de référence. Le résultat devrait ressembler à la mode de fusion produit dans Photoshop, où les blancs seraient remplacées par de la teinte:

alt text

Je vais changer la couleur de la valeur en continu.

Suivi: je mettrais le code pour faire cela dans mon ImageView est drawRect: méthode, non?

Comme toujours, un extrait de code serait grandement aider dans ma compréhension, par opposition à un lien.

Mise à jour: sous-classement d'une UIImageView avec le code Ramin suggéré.

J'ai mis cela dans le viewDidLoad: de mon point de vue, contrôleur:

[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];

Je vois l'image, mais il n'est pas teinté. J'ai aussi essayé de charger d'autres images, réglage de l'image de l'IB, et en appelant setNeedsDisplay: de mon point de vue contrôleur.

Mise à jour: drawRect: n'est pas appelée.

Dernière mise à jour: j'ai trouvé un vieux projet qui avait une imageView mis en place correctement, donc j'ai pu tester Ramin code et il fonctionne comme un charme!

Finale, dernière mise à jour:

Pour ceux de vous apprendre au sujet des Graphiques de Base, ici, est la chose la plus simple qui pourrait éventuellement fonctionner.

Dans votre sous-classé 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
}

76voto

Toland Hon Points 814

Dans iOS7, ils ont introduit la propriété tintColor sur UIImageView et renderingMode sur UIImage. Pour teinter un UIImage sur iOS7, il suffit de:

 UIImageView* imageView = …
UIImage* originalImage = …
UIImage* imageForRendering = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
imageView.image = imageForRendering;
imageView.tintColor = [UIColor redColor]; // or any color you want to tint it with
 

44voto

Ramin Points 10412

D'abord, vous aurez envie de la sous-classe UIImageView et remplacer la méthode drawRect. Votre classe a besoin d'un UIColor propriété (appelons overlayColor) pour maintenir le mélange de couleur et une coutume setter que les forces d'un redessiner lorsque les changements de couleur. Quelque chose comme ceci:

- (void) setOverlayColor:(UIColor *)newColor {
   if (overlayColor)
     [overlayColor release];

   overlayColor = [newColor retain];
   [self setNeedsDisplay]; // fires off drawRect each time color changes
}

Dans la méthode drawRect vous aurez envie de dessiner l'image d'abord, puis de superposer un rectangle rempli avec la couleur que vous voulez avec le bon mode de fusion, quelque chose comme ceci:

- (void) drawRect:(CGRect)area
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSaveGState(context);

  // Draw picture first
  //
  CGContextDrawImage(context, self.frame, self.image.CGImage);

  // Blend mode could be any of CGBlendMode values. Now draw filled rectangle
  // over top of image.
  //
  CGContextSetBlendMode (context, kCGBlendModeMultiply);
  CGContextSetFillColor(context, CGColorGetComponents(self.overlayColor.CGColor));  	
  CGContextFillRect (context, self.bounds);
  CGContextRestoreGState(context);
}

Normalement pour optimiser le dessin, vous permettrait de restreindre l'affichage à la zone transmis à drawRect, mais depuis l'image d'arrière-plan doit être redessinée à chaque fois les changements de couleur, c'est probablement la chose entière aurez besoin d'un rafraichissement.

À utiliser pour créer une instance de l'objet puis définissez l' image de la propriété (héritée de UIImageView) de l'image et de l' overlayColor pour un UIColor valeur (les niveaux de mélange peut être ajustée en changeant la valeur alpha de la couleur que vous passez en bas).

26voto

mpstx Points 793

Juste une clarification rapide (après quelques recherches sur ce sujet)... la pomme de docs ici, clairement que:

"UIImageView ne vais pas appeler drawRect: une sous-classe. Si votre sous-classe doit code de dessin personnalisé, il est recommandé de les utiliser UIView comme la classe de base."

afin de ne même pas perdre de temps à tenter de passer outre à cette méthode dans une UIImageView sous-classe . . . commencez avec UIView à la place.

5voto

Cela pourrait être très utile: PhotoshopFramework est une bibliothèque puissante pour manipuler des images sur Objective-C. Ceci a été développé pour apporter les mêmes fonctionnalités que les utilisateurs d'Adobe Photoshop. Exemples: définition des couleurs à l'aide de RVB 0-255, application de filtres de fondu, de transformations, etc.

Est open source, voici le lien du projet: https://sourceforge.net/projects/photoshopframew/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X