Swift縮放并填充圖片功能的實(shí)現(xiàn)
摘要
直接操作圖片來實(shí)現(xiàn)它的縮放或者填充多余空間,首選 UIGraphicsBeginImageContext 函數(shù)來實(shí)現(xiàn),它就相當(dāng)于一個(gè)畫布,你甚至可以用它來涂鴉。
最近有一個(gè)需求,就是將圖片先等比例縮放到指定大小,然后將空余出來空間填充為黑色,返回指定大小的圖片。
這種直接操作圖片的需求,就要考慮使用 UIGraphicsBeginImageContext 函數(shù)實(shí)現(xiàn)。它可以理解為一個(gè)畫布,我們只需要把圖片放在畫布的對應(yīng)位置,把畫布的多余地方全部涂成黑色就完成。
實(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)容,將視圖寫入到新的圖像對象
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
看代碼,總結(jié)出邏輯很簡單,就是首先根據(jù)目標(biāo)的 size 來計(jì)算出需要縮放的比例(按照最大邊來處理),計(jì)算出圖片在畫布中的對應(yīng)位置和縮放后的寬高。
最后就是重頭戲,調(diào)用 UIGraphicsBeginImageContext 來繪畫。這里要留意幾個(gè)參數(shù)的設(shè)置:
- UIGraphicsBeginImageContext(targetSize) 中的 targetSize 是設(shè)置畫布的大小。
- image.draw(in:) 是圖片在畫布中的 rect 。
- context 是畫布的對象
- context?.setFillColor(_) 是設(shè)置畫布的顏色,若不設(shè)置,默認(rèn)為 black(黑色)
- context?.fill()是設(shè)置畫布填充的 rect。
重點(diǎn)
如果是前面留意邏輯時(shí),會發(fā)現(xiàn)邏輯中是先放置圖片,然后填充空余空間,但是代碼中是先填充全部空間,然后再放置圖片,這是為什么?
經(jīng)過測試后發(fā)現(xiàn),后繪制的區(qū)域會覆蓋掉先前已經(jīng)繪制的區(qū)域,所以代碼中的處理就是防止填充區(qū)域覆蓋圖片區(qū)域。
到此這篇關(guān)于Swift縮放并填充圖片功能的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Swift縮放填充圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式
這篇文章主要介紹了在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式,通過實(shí)現(xiàn)類定義類型字段實(shí)現(xiàn)和以動(dòng)態(tài)service名稱的方式實(shí)現(xiàn),并且通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03
SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例
緩存就是一個(gè)存儲器,常用 Redis作為緩存數(shù)據(jù)庫,本文主要介紹了SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體
最近在學(xué)swift 3.0,主要看的是蘋果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
Swift UILable 設(shè)置內(nèi)邊距實(shí)例代碼
本文主要介紹Swift UILable 設(shè)置內(nèi)邊距,這里提供示例代碼供大家參考,有需要的小伙伴可以看下2016-07-07

