2010-02-21 3 views
2

J'ai vraiment besoin d'émuler le comportement de drawInRect: fromRect: operation: fraction de NSImage en utilisant UIImage et je me demande quelle est la meilleure approche ou (mieux), si quelqu'un a déjà fait ceci et disposé à partager le code.Emulation de NSImage drawInRect: fromRect: opération: fraction avec UIImage

J'ai essayé de le faire en utilisant CGImageCreateWithImageInRect (voir le code à la fin) mais je n'obtiens pas les résultats attendus. Notez que le code teste réellement ceci sur le Mac (je ne peux pas courir le tout sur l'iPhone dès maintenant) afin que je puisse avoir un problème avec obtenir le CGImage de NSImage

- (void)drawInRect:(CGRect)rect fromRect:(CGRect)fromRect alpha:(float)alpha { 
     CGContextRef context; 
     CGImageRef originalImageRef; 
     CGImageRef subimageRef; 

#if ERMac 
     context=[[NSGraphicsContext currentContext] graphicsPort]; 

     CGImageSourceRef source; 

     source = CGImageSourceCreateWithData((CFDataRef)[self TIFFRepresentation], NULL); 
     originalImageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL); 
     CFRelease(source); 
#else 
     context=UIGraphicsGetCurrentContext(); 
     originalImageRef=CGImageRetain([self CGImage]); 
#endif 

     subimageRef = CGImageCreateWithImageInRect (originalImageRef, fromRect); 


     CGContextDrawImage(context, rect, subimageRef); 


     if (subimageRef) 
      CGImageRelease(subimageRef); 
     if (originalImageRef) 
      CGImageRelease(originalImageRef); 
} 

Répondre

0

UIImage a drawInRect: blendMode: alpha :. Une astuce simple pour extraire un sous-rectangle d'un UIImage est de dessiner dans un contexte cible qui est la taille du rectangle que vous voulez extraire, en ajustant l'origine de l'image dessinée vers le haut et vers la gauche pour que la partie droite tombe dans la cible le contexte. CGImage est également un bon moyen de le faire, mais vous pouvez rencontrer des problèmes avec le système de coordonnées étant retourné sur l'iPhone. Une solution facile consiste à envelopper le CGImage dans un UIImage et à le dessiner, car UIImage sait quel chemin prendre.

2

Voilà comment je le fais ...

- (void)drawInRect:(CGRect)drawRect fromRect:(CGRect)fromRect operation:(CGBlendMode)blendMode fraction:(CGFloat)alpha 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextClipToRect(context, drawRect); 

    CGFloat xScale = (drawRect.size.width/fromRect.size.width); 
    CGFloat yScale = (drawRect.size.height/fromRect.size.height); 

    CGFloat scale = 1; 
    if([self respondsToSelector:@selector(scale)]) 
    { 
     scale = self.scale; 
    } 

    CGFloat actualWidth = (xScale * self.size.width)*scale; 
    CGFloat actualHeight = (yScale * self.size.height)*scale; 
    CGFloat xInset = fromRect.origin.x * xScale; 
    CGFloat yInset = fromRect.origin.y * yScale; 

    // Take care of Y-axis inversion problem by translating the context on the y axis 
    CGContextTranslateCTM(context, 0, drawRect.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextDrawImage(context, CGRectMake(-xInset + drawRect.origin.x, -yInset + drawRect.origin.y, actualWidth, actualHeight), self.CGImage); 

    CGContextRestoreGState(context); 
}