UIImage
有cgImage
和ciImage
屬性,分別可以獲得CGImage
和CIImage
對象。CGImage
和CIImage
對象都有cropping(to:)
方法,傳入CGRect
的參數表示要裁剪的區域(采用UIImage
的坐標)。
static func cropImage(_ image: UIImage, withRect rect: CGRect) -> UIImage? { if let cgImage = image.cgImage, let croppedCgImage = cgImage.cropping(to: rect) { return UIImage(cgImage: croppedCgImage) } else if let ciImage = image.ciImage { let croppedCiImage = ciImage.cropping(to: rect) return UIImage(ciImage: croppedCiImage) } return nil }
對CGImage
來說,傳入的CGRect
參數如果完全不在原圖區域內,cropping(to:)
方法返回空;如果有部分在原圖區域內,cropping(to:)
方法返回在原圖區域部分的CGImage
。
通過位圖重新繪制圖片,也可以獲得裁剪之後的圖片。
static func cropImage(_ image: UIImage, withRect rect: CGRect) -> UIImage? { UIGraphicsBeginImageContext(rect.size) guard let context = UIGraphicsGetCurrentContext() else { return nil } context.translateBy(x: -rect.minX, y: -rect.minY) image.draw(at: .zero) let croppedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return croppedImage }
位圖大小為需要裁剪區域CGRect
的大小size
。用原圖繪制,為了使裁剪區域正好在位圖區域,需要進行坐標位移context.translateBy(x: -rect.minX, y: -rect.minY)
。
如果傳入的CGRect
參數有部分或全部不在原圖區域內,則超出原圖區域的部分也會被繪制(繪制為透明),這與CGImage
的裁剪方法不同。
簡單試了幾次,發現通過 CGImage 裁剪的 CPU 占用率比通過位圖裁剪要低。僅從性能角度考慮,推薦使用前者。如果希望裁剪出來的圖片不超出原圖區域,也推薦使用前者。如果需要繪制其他的內容(比如其他形狀、顏色,或繪制的內容超出原圖區域),則要使用後者。
轉載請注明出處:http://www.cnblogs.com/silence-cnblogs/p/6490037.html
【iOS 圖片裁剪方法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!