上代码:
import Foundation
import UIKit
extension UIImage {
func crop(_ rect: CGRect) -> UIImage? {
var newRect = rect
newRect.origin.x *= scale
newRect.origin.y *= scale
newRect.size.width *= scale
newRect.size.height *= scale
guard let imageRef = self.cgImage?.cropping(to: newRect) else { return nil }
return UIImage(cgImage: imageRef, scale: scale, orientation: imageOrientation)
}
func resize(_ size: CGSize) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
self.draw(in: CGRect(origin: .zero, size: size))
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resizedImage
}
func scaleToFitAtCenter(size: CGSize) -> UIImage? {
let scaleW_H = size.width / size.height
let selfScaleW_H = self.size.width / self.size.height
if selfScaleW_H > scaleW_H {
let w = self.size.height * scaleW_H
let h = self.size.height
let x = (self.size.width - w) / 2.0
let y: CGFloat = 0
return self.crop(CGRect(x: x, y: y, width: w, height: h))?.resize(size)
} else {
let w = self.size.width
let h = self.size.width / scaleW_H
let x: CGFloat = 0
let y = (self.size.height - h) / 2.0
return self.crop(CGRect(x: x, y: y, width: w, height: h))?.resize(size)
}
}
}
第三个函数 scaleToFitAtCenter 非常实用,把缩放和裁剪融为一体,AtCenter表示裁剪的部位为居中,可以自己根据需要追加裁剪部位。但是居中大多数时候是最常见的。
附:本人公众号“风海铜锣”,加公众号验证身份是开发者即可以入我的群“移动开发联盟”。