Swift縮放並填充圖片功能的實現
摘要
直接操作圖片來實現它的縮放或者填充多餘空間,首選 UIGraphicsBeginImageContext 函數來實現,它就相當於一個畫佈,你甚至可以用它來塗鴉。
最近有一個需求,就是將圖片先等比例縮放到指定大小,然後將空餘出來空間填充為黑色,返回指定大小的圖片。
這種直接操作圖片的需求,就要考慮使用 UIGraphicsBeginImageContext 函數實現。它可以理解為一個畫佈,我們隻需要把圖片放在畫佈的對應位置,把畫佈的多餘地方全部塗成黑色就完成。
實現
先看代碼,然後再分析:
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 ) // 創建繪圖上下文環境 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)) // 獲取上下文裡的內容,將視圖寫入到新的圖像對象 let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }
看代碼,總結出邏輯很簡單,就是首先根據目標的 size 來計算出需要縮放的比例(按照最大邊來處理),計算出圖片在畫佈中的對應位置和縮放後的寬高。
最後就是重頭戲,調用 UIGraphicsBeginImageContext 來繪畫。這裡要留意幾個參數的設置:
- UIGraphicsBeginImageContext(targetSize) 中的 targetSize 是設置畫佈的大小。
- image.draw(in:) 是圖片在畫佈中的 rect 。
- context 是畫佈的對象
- context?.setFillColor(_) 是設置畫佈的顏色,若不設置,默認為 black(黑色)
- context?.fill()是設置畫佈填充的 rect。
重點
如果是前面留意邏輯時,會發現邏輯中是先放置圖片,然後填充空餘空間,但是代碼中是先填充全部空間,然後再放置圖片,這是為什麼?
經過測試後發現,後繪制的區域會覆蓋掉先前已經繪制的區域,所以代碼中的處理就是防止填充區域覆蓋圖片區域。
到此這篇關於Swift縮放並填充圖片功能的實現的文章就介紹到這瞭,更多相關Swift縮放填充圖片內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!