dimanche 18 mars 2012

Dessin de la pièce d'un UIImage

Happy Thanksgiving, et désolé pour le manque relatif de posts ici dernièrement. Les choses sont plus fou que jamais et ça a été un défi de trouver le temps de prendre une douche, et encore moins de blog.

J'ai quelque chose à partager, aujourd'hui, cependant. Non, ce n'est pas le prochain chapitre de l'OpenGL ES 2.0 pour iOS. C'est une catégorie que certains d'entre vous pourriez trouver utiles: une méthode qui vous permet de dessiner une partie seulement du UIImage plutôt que la chose entière.

Sur le Mac, NSImage a une méthode d'instance pratique appelé drawInRect: fromRect: fonctionnement: Dans la fraction: qui vous permet de spécifier exactement quelle partie d'une image à dessiner. Le UIImage, nous avons seulement la capacité de dessiner l'image entière soit moins que nous déroulant au Core Graphics appels. Nous n'avons pas un gentil, facile et pratique à l'aide simplement de dessiner un UIImage partie de l'image qu'elle représente.

J'avais besoin de cette capacité dans une application que je travaille, donc je piraté la catégorie suivante. À première vue, cela peut ressembler à être inefficace, puisque nous faisons une copie de sauvegarde CGImage de l'instance afin de créer l'image sous-pourtant je crois que CGImageCreateWithImageInRect () les références données bitmap de l'image originale. Je n'ai pas confirmé qu'il ne fait pas une copie des données bitmap, mais la documentation semble certainement que cela implique. Quelqu'un sait?

Quoi qu'il en soit, voici la catégorie; J'ai même commenté le code plus pédante que ce qui est normal pour moi au cas où quelqu'un pourrait être confus au sujet de ce qui se passe. Améliorations et corrections de bugs sont, comme toujours, les bienvenues.

@implementation UIImage(MCDrawSubImage)
- (void)drawInRect:(CGRect)drawRect fromRect:(CGRect)fromRect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha
{
CGImageRef drawImage = CGImageCreateWithImageInRect(self.CGImage, fromRect);
if (drawImage != NULL)
{
CGContextRef context = UIGraphicsGetCurrentContext();

// Push current graphics state so we can restore later
CGContextSaveGState(context);

// Set the alpha and blend based on passed in settings
CGContextSetBlendMode(context, blendMode);
CGContextSetAlpha(context, alpha);

// Take care of Y-axis inversion problem by translating the context on the y axis
CGContextTranslateCTM(context, 0, drawRect.origin.y + fromRect.size.height);

// Scaling -1.0 on y-axis to flip
CGContextScaleCTM(context, 1.0, -1.0);

// Then accommodate the translate by adjusting the draw rect
drawRect.origin.y = 0.0f;

// Draw the image
CGContextDrawImage(context, drawRect, drawImage);

// Clean up memory and restore previous state
CGImageRelease(drawImage);

// Restore previous graphics state to what it was before we tweaked it
CGContextRestoreGState(context);
}

}

@end



Aucun commentaire: