UIImageView: se transforme UIImage

Je fais tourner UIImageView en utilisant ceci:

[UIView beginAnimations:nil context:nil]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; myImgView.transform = CGAffineTransformMakeRotation(angle*M_PI/180); [UIView commitAnimations]; 

Maintenant, je veux get une image pivotée. Puis-je faire ceci? J'essayais de le faire avec CoreGraphics en utilisant la fonction CGImageRotatedByAngle de la réponse acceptée pour cette question mais il transforme les coordonnées faiblement incorrectes (enfin nous obtenons une troisième capture d'écran marquée comme erronée). Comme vous pouvez le voir, l'image perd sa taille d'origine et est recadrée. Mon but est d'get l'image comme sur le tir central avec la taille originale et tournée pour l'angle spécifié. Je veux dire qu'il est nécessaire que la taille de la forme rotative rest inchangée mais une nouvelle image va bien sûr être plus grande que l'initiale.

entrez la description de l'image ici

OK, je répète ma propre question encore, j'espère que cela sera utile pour quelqu'un dans le futur … Revenons à CGImageRotatedByAngle comme je l'ai dit précédemment cela donne un effet presque nécessaire mais la séquence de traduction du système de coordonnées doit être légèrement modifiée. Et voici comment j'ai obtenu le résultat souhaité:

 - (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle { CGFloat angleInRadians = angle * (M_PI / 180); CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGRect imgRect = CGRectMake(0, 0, width, height); CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef bmContext = CGBitmapContextCreate(NULL, rotatedRect.size.width, rotatedRect.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); CGContextSetAllowsAntialiasing(bmContext, YES); CGContextSetShouldAntialias(bmContext, YES); CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh); CGColorSpaceRelease(colorSpace); CGContextTranslateCTM( bmContext, 0.5f * rotatedRect.size.width, 0.5f * rotatedRect.size.height ) ; CGContextRotateCTM(bmContext, angleInRadians); CGContextDrawImage(bmContext, CGRectMake(-imgRect.size.width* 0.5f, -imgRect.size.height * 0.5f, imgRect.size.width, imgRect.size.height), imgRef); CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); CFRelease(bmContext); [(id)rotatedImage autorelease]; return rotatedImage; } 

cela fonctionne pour moi, et une autre façon de résoudre

 - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees { CGRect imgRect = CGRectMake(0, 0, self.size.width, self.size.height); CGAffineTransform transform = CGAffineTransformMakeRotation(DegreesToRadians(degrees)); CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); CGSize rotatedSize = rotatedRect.size; // Create the bitmap context UIGraphicsBeginImageContext(rotatedRect.size); CGContextRef bitmap = UIGraphicsGetCurrentContext(); // Move the origin to the middle of the image so we will rotate and scale around the center. CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); // Rotate the image context CGContextRotateCTM(bitmap, DegreesToRadians(degrees)); // Now, draw the rotated/scaled image into the context CGContextScaleCTM(bitmap, 1.0, -1.0); CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }