Swift縮放并填充圖片功能的實(shí)現(xiàn)
摘要
直接操作圖片來(lái)實(shí)現(xiàn)它的縮放或者填充多余空間,首選 UIGraphicsBeginImageContext 函數(shù)來(lái)實(shí)現(xiàn),它就相當(dāng)于一個(gè)畫(huà)布,你甚至可以用它來(lái)涂鴉。
最近有一個(gè)需求,就是將圖片先等比例縮放到指定大小,然后將空余出來(lái)空間填充為黑色,返回指定大小的圖片。
這種直接操作圖片的需求,就要考慮使用 UIGraphicsBeginImageContext 函數(shù)實(shí)現(xiàn)。它可以理解為一個(gè)畫(huà)布,我們只需要把圖片放在畫(huà)布的對(duì)應(yīng)位置,把畫(huà)布的多余地方全部涂成黑色就完成。
實(shí)現(xiàn)
先看代碼,然后再分析:
func rescaleAndPading(_ image: UIImage, targetSize: CGSize) -> UIImage? { let max = max(image.width, image.height) let ratio = Float(targetSize.width) / Float(max) let (newWidth, newHeight) = ( Int(Float(image.width) * ratio), Int(Float(image.height) * ratio) ) let (tarWidth, tarHeight) = ( Int(targetSize.width), Int(targetSize.height) ) let deltaW = tarWidth - newWidth let deltaH = tarHeight - newHeight let (y, x) = ( deltaH / 2, deltaW / 2 ) // 創(chuàng)建繪圖上下文環(huán)境 UIGraphicsBeginImageContext(targetSize) let context = UIGraphicsGetCurrentContext() // 黃色背景 context?.setFillColor(UIColor.yellow.cgColor) context?.fill(CGRect(x: 0, y: 0, width: tarWidth, height: tarHeight)) image.draw(in: CGRect(x: x, y: y, width: newWidth, height: newHeight)) // 獲取上下文里的內(nèi)容,將視圖寫(xiě)入到新的圖像對(duì)象 let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }
看代碼,總結(jié)出邏輯很簡(jiǎn)單,就是首先根據(jù)目標(biāo)的 size 來(lái)計(jì)算出需要縮放的比例(按照最大邊來(lái)處理),計(jì)算出圖片在畫(huà)布中的對(duì)應(yīng)位置和縮放后的寬高。
最后就是重頭戲,調(diào)用 UIGraphicsBeginImageContext 來(lái)繪畫(huà)。這里要留意幾個(gè)參數(shù)的設(shè)置:
- UIGraphicsBeginImageContext(targetSize) 中的 targetSize 是設(shè)置畫(huà)布的大小。
- image.draw(in:) 是圖片在畫(huà)布中的 rect 。
- context 是畫(huà)布的對(duì)象
- context?.setFillColor(_) 是設(shè)置畫(huà)布的顏色,若不設(shè)置,默認(rèn)為 black(黑色)
- context?.fill()是設(shè)置畫(huà)布填充的 rect。
重點(diǎn)
如果是前面留意邏輯時(shí),會(huì)發(fā)現(xiàn)邏輯中是先放置圖片,然后填充空余空間,但是代碼中是先填充全部空間,然后再放置圖片,這是為什么?
經(jīng)過(guò)測(cè)試后發(fā)現(xiàn),后繪制的區(qū)域會(huì)覆蓋掉先前已經(jīng)繪制的區(qū)域,所以代碼中的處理就是防止填充區(qū)域覆蓋圖片區(qū)域。
到此這篇關(guān)于Swift縮放并填充圖片功能的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Swift縮放填充圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
swift4.0實(shí)現(xiàn)視頻播放、屏幕旋轉(zhuǎn)、倍速播放、手勢(shì)調(diào)節(jié)及鎖屏面板等功能實(shí)例
這篇文章主要給大家介紹了關(guān)于swift4.0實(shí)現(xiàn)視頻播放、屏幕旋轉(zhuǎn)、倍速播放、手勢(shì)調(diào)節(jié)及鎖屏面板等功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01詳解Swift語(yǔ)言中的類(lèi)與結(jié)構(gòu)體
這篇文章主要介紹了Swift語(yǔ)言中的類(lèi)與結(jié)構(gòu)體,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11Swift?并發(fā)修改Sendable?閉包實(shí)例詳解
這篇文章主要為大家介紹了Swift?并發(fā)修改Sendable?閉包實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能
這篇文章主要為大家詳細(xì)介紹了純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11詳談swift內(nèi)存管理中的引用計(jì)數(shù)
下面小編就為大家?guī)?lái)一篇詳談swift內(nèi)存管理中的引用計(jì)數(shù)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09判斷?ScrollView List?是否正在滾動(dòng)詳解
這篇文章主要為大家介紹了判斷?ScrollView、List?是否正在滾動(dòng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09iOS Swift UICollectionView橫向分頁(yè)滾動(dòng),cell左右排版問(wèn)題詳解
UICollectionView是iOS中比較常見(jiàn)的一個(gè)控件,這篇文章主要給大家介紹了關(guān)于iOS Swift UICollectionView橫向分頁(yè)滾動(dòng),cell左右排版問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例
希爾排序是對(duì)插入排序的一種改進(jìn)版本,算法本身并不穩(wěn)定,存在優(yōu)化空間,這里我們來(lái)講一下希爾排序的大體思路及Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例2016-07-07swift4 使用DrawerController實(shí)現(xiàn)側(cè)滑菜單功能的示例代碼
這篇文章主要介紹了swift4 使用DrawerController實(shí)現(xiàn)側(cè)滑功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06關(guān)于Swift 4.1中的Codable改進(jìn)詳解
這篇文章主要給大家介紹了關(guān)于Swift 4.1中的Codable改進(jìn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02