J'appelle le code suivant de drawRectobtenir le UIImage (ou CGImage) de drawRect
- (void) drawPartial:(UIImage *)img colour:(UIColor *)colour {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, self.frame, img.CGImage);
if (colour!=nil) {
CGContextSetBlendMode (context, kCGBlendModeColor);
CGContextClipToMask(context, self.bounds, img.CGImage);
CGContextSetFillColor(context, CGColorGetComponents(colour.CGColor));
CGContextFillRect (context, self.bounds);
}
self.currentImage=UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(context);
}
Enfait je l'appelle plusieurs fois pour construire une image composite de couleur dynamique. Chaque img transmis est effectivement une superposition transparente avec une partie différente de l'image sur elle.
Je peux construire mon image composée en l'appelant plusieurs fois dans drawrect. Le problème vient quand je veux mettre à jour une partie de l'image. Idéalement, je serais en mesure d'appeler la fonction ci-dessus et juste changer la partie: J'ai essayé de jouer avec self.clearsContextBeforeDrawing en vain.
Je pensais que je voudrais essayer de garder une copie de l'image de chaque tirage, comme une image en cache de l'état - de cette façon j'ai juste besoin de superposer la nouvelle partie sur ce point: deux appels plutôt que 15.
Cependant, la ligne self.currentImage = UIGraphicsGetImageFromCurrentImageContext() ne me renvoie pas l'image actuelle, donc je ne peux pas créer de copie en cache.
Toute aide sur l'une ou l'autre approche serait vraiment appréciée. (ou évidemment me pointer la façon dont je devrais faire cela!)
EDIT J'ai également essayé de composer l'image en separtly en utilisant pratiquement le même code, puis en dessinant cela, mais encore une fois je ne reçois pas l'image .. .
- (UIImage *) overlayImage:(UIImage *)srcImage withImage:(UIImage *)overlayImage ofColour:(UIColor *)colour {
CGSize size =srcImage.size;
CGRect box = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContext(size);
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, box, srcImage.CGImage);
if (colour!=nil) {
CGContextSetBlendMode (context, kCGBlendModeColor); //kCGBlendModeMultiply
CGContextClipToMask(context, box, overlayImage.CGImage); // respect alpha mask
CGContextSetFillColor(context, CGColorGetComponents(colour.CGColor));
CGContextFillRect (context, box);
}
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
//UIImage *result = [UIImage imageWithCGImage: CGBitmapContextCreateImage (context)];
UIGraphicsEndImageContext();
return result;
}
Vous ne pouvez pas obtenir une image du contexte de dessin par défaut. Vous ne pouvez en obtenir qu'un si vous démarrez explicitement un contexte séparé (hors écran) avec UIGraphicsBeginImageContext. –