UIImageView:变换UIImage

我正在使用这个旋转UIImageView:

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

现在我想获得旋转图像。 我可以这样做吗? 我试图用CoreGraphics使用CGImageRotatedByAngle函数来接受这个问题的答案,但它变换坐标slighlty不正确(最后我们得到标记为错误的第三个屏幕截图)。 正如您所看到的,图像会丢失其原始大小并被裁剪。 我的目标是获得原始大小的中央镜头和旋转指定角度的图像。 我的意思是要求旋转形状的大小保持不变,但新图像当然要比初始大。

在此处输入图像描述

好吧,我再次回答我自己的问题,希望它对未来的某些人有用……回到CGImageRotatedByAngle,正如我之前所说,它提供了几乎所需的效果,但是坐标系翻译序列必须略有改变。 这是我得到预期结果的方式:

 - (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; } 

它适用于我,另一种解决方法

 - (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; } 

这是swimal 4.1版本的heximal的答案。

 extension CGImage { func rotated(by angle: CGFloat) -> CGImage? { let angleInRadians = angle * .pi / 180 let imgRect = CGRect(x: 0, y: 0, width: width, height: height) let transform = CGAffineTransform.identity.rotated(by: angleInRadians) let rotatedRect = imgRect.applying(transform) let colorSpace = CGColorSpaceCreateDeviceRGB() guard let bmContext = CGContext( data: nil, width: Int(rotatedRect.size.width), height: Int(rotatedRect.size.height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue) else { return nil } bmContext.setAllowsAntialiasing(true) bmContext.setShouldAntialias(true) bmContext.interpolationQuality = .high bmContext.translateBy(x: rotatedRect.size.width * 0.5, y: rotatedRect.size.height * 0.5) bmContext.rotate(by: angleInRadians) let drawRect = CGRect( origin: CGPoint(x: -imgRect.size.width * 0.5, y: -imgRect.size.height * 0.5), size: imgRect.size) bmContext.draw(self, in: drawRect) guard let rotatedImage = bmContext.makeImage() else { return nil } return rotatedImage } }