iOS 圖片裁剪的實(shí)現(xiàn)方法
iOS 圖片裁剪方法,主要有兩種,一起來(lái)看下。
通過(guò) CGImage 或 CIImage 裁剪
UIImage
有cgImage
和ciImage
屬性,分別可以獲得CGImage
和CIImage
對(duì)象。CGImage
和CIImage
對(duì)象都有cropping(to:)
方法,傳入CGRect
的參數(shù)表示要裁剪的區(qū)域(采用UIImage
的坐標(biāo))。
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 }
對(duì)CGImage
來(lái)說(shuō),傳入的CGRect
參數(shù)如果完全不在原圖區(qū)域內(nèi),cropping(to:)
方法返回空;如果有部分在原圖區(qū)域內(nèi),cropping(to:)
方法返回在原圖區(qū)域部分的CGImage
。
通過(guò)位圖(Bitmap)裁剪
通過(guò)位圖重新繪制圖片,也可以獲得裁剪之后的圖片。
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 }
位圖大小為需要裁剪區(qū)域CGRect
的大小size
。用原圖繪制,為了使裁剪區(qū)域正好在位圖區(qū)域,需要進(jìn)行坐標(biāo)位移context.translateBy(x: -rect.minX, y: -rect.minY)
。
如果傳入的CGRect
參數(shù)有部分或全部不在原圖區(qū)域內(nèi),則超出原圖區(qū)域的部分也會(huì)被繪制(繪制為透明),這與CGImage
的裁剪方法不同。
簡(jiǎn)單試了幾次,發(fā)現(xiàn)通過(guò) CGImage 裁剪的 CPU 占用率比通過(guò)位圖裁剪要低。僅從性能角度考慮,推薦使用前者。如果希望裁剪出來(lái)的圖片不超出原圖區(qū)域,也推薦使用前者。如果需要繪制其他的內(nèi)容(比如其他形狀、顏色,或繪制的內(nèi)容超出原圖區(qū)域),則要使用后者。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS中設(shè)置清除緩存功能的實(shí)現(xiàn)方法
清除緩存基本上都是在設(shè)置界面的某一個(gè)Cell,于是我們可以把清除緩存封裝在某一個(gè)自定義Cell中,現(xiàn)在位大家介紹一種最基礎(chǔ)的清除緩存的方法,感興趣的朋友一起看看吧2017-07-07

Flutter?GetPageRoute實(shí)現(xiàn)嵌套導(dǎo)航學(xué)習(xí)

iOS開(kāi)發(fā)中CAlayer層的屬性以及自定義層的方法

Swift實(shí)現(xiàn)iOS應(yīng)用中短信驗(yàn)證碼倒計(jì)時(shí)功能的實(shí)例分享

iOS開(kāi)發(fā)中Date Picker和UITool Bar控件的使用簡(jiǎn)介