对于您的 Swift 2.1 项目,这是@marcelosalloum 代码的翻译:
func scaleAndRotateImage(image: UIImage, kMaxResolution: CGFloat) -> UIImage {
var imageCopy: UIImage = image
if let imgRef: CGImageRef = image.CGImage {
let width = CGFloat(CGImageGetWidth(imgRef))
let height = CGFloat(CGImageGetHeight(imgRef))
var transform = CGAffineTransformIdentity
var bounds = CGRectMake(0, 0, width, height)
if width > kMaxResolution || height > kMaxResolution {
let ratio = width/height
if ratio > 1 {
bounds.size.width = kMaxResolution
bounds.size.height = bounds.size.width / ratio
} else {
bounds.size.height = kMaxResolution
bounds.size.width = bounds.size.height * ratio
}
}
let scaleRatio = bounds.size.width / width
let imageSize = CGSizeMake(width, height)
let boundHeight: CGFloat
let orient: UIImageOrientation = image.imageOrientation
switch orient {
case .Up:
transform = CGAffineTransformIdentity
case .UpMirrored:
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0)
transform = CGAffineTransformScale(transform, -1.0, 1.0)
case .Down:
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height)
transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
case .DownMirrored: //EXIF = 4
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
case .LeftMirrored: //EXIF = 5
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
transform = CGAffineTransformRotate(transform, 3.0 * CGFloat(M_PI) / 2.0);
case .Left: //EXIF = 6
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
transform = CGAffineTransformRotate(transform, 3.0 * CGFloat(M_PI) / 2.0);
case .RightMirrored: //EXIF = 7
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeScale(-1.0, 1.0);
transform = CGAffineTransformRotate(transform, CGFloat(M_PI) / 2.0);
case .Right: //EXIF = 8
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
transform = CGAffineTransformRotate(transform, CGFloat(M_PI) / 2.0);
}
UIGraphicsBeginImageContext(bounds.size)
if let context: CGContextRef = UIGraphicsGetCurrentContext() {
if orient == .Right || orient == .Left {
CGContextScaleCTM(context, -scaleRatio, scaleRatio)
CGContextTranslateCTM(context, -height, 0)
} else {
CGContextScaleCTM(context, scaleRatio, -scaleRatio)
CGContextTranslateCTM(context, 0, -height)
}
CGContextConcatCTM(context, transform)
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0,0,width,height), imgRef)
imageCopy = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
}
return imageCopy
}