最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift縮放并填充圖片功能的實(shí)現(xiàn)

 更新時(shí)間:2021年11月02日 11:56:24   作者:我為雙魚(yú)狂  
最近有一個(gè)需求,就是將圖片先等比例縮放到指定大小,然后將空余出來(lái)空間填充為黑色,返回指定大小的圖片。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

摘要

直接操作圖片來(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)文章

  • Swift?列舉內(nèi)存管理與異常處理具體代碼

    Swift?列舉內(nèi)存管理與異常處理具體代碼

    內(nèi)存管理和異常處理在任何編程語(yǔ)言中都是核心概念。盡管有很多教程解釋了Swift自動(dòng)引用計(jì)數(shù)的基本原理,但我發(fā)現(xiàn)沒(méi)有一個(gè)可以從編譯器的角度對(duì)其進(jìn)行解釋。在本文中,我們將通過(guò)詳細(xì)代碼列舉學(xué)習(xí)Swift內(nèi)存管理與異常處理
    2021-11-11
  • 在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式

    在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式

    這篇文章主要介紹了在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式,通過(guò)實(shí)現(xiàn)類定義類型字段實(shí)現(xiàn)和以動(dòng)態(tài)service名稱的方式實(shí)現(xiàn),并且通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • 深入理解Swift中的訪問(wèn)控制關(guān)鍵字

    深入理解Swift中的訪問(wèn)控制關(guān)鍵字

    這篇文章主要給大家介紹了Swift中訪問(wèn)控制關(guān)鍵字的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

    SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

    緩存就是一個(gè)存儲(chǔ)器,常用 Redis作為緩存數(shù)據(jù)庫(kù),本文主要介紹了SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Swift中的可變參數(shù)函數(shù)介紹

    Swift中的可變參數(shù)函數(shù)介紹

    這篇文章主要介紹了Swift中的可變參數(shù)函數(shù)介紹,本文實(shí)現(xiàn)了和Objective-C調(diào)用方法一樣的變參數(shù)函數(shù),需要的朋友可以參考下
    2015-01-01
  • Swift教程之基本運(yùn)算符詳解

    Swift教程之基本運(yùn)算符詳解

    這篇文章主要介紹了Swift教程之基本運(yùn)算符詳解,本文講解了賦值運(yùn)算符、數(shù)學(xué)運(yùn)算符、取余運(yùn)算符、浮點(diǎn)余數(shù)計(jì)算、自增和自減運(yùn)算符等,需要的朋友可以參考下
    2015-01-01
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體

    Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體

    最近在學(xué)swift 3.0,主要看的是蘋(píng)果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對(duì)你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03
  • 淺談swift 4.0中private所發(fā)生的變化

    淺談swift 4.0中private所發(fā)生的變化

    Swift 4是蘋(píng)果計(jì)劃于2017年秋季推出的最新版本,其主要重點(diǎn)是提供與Swift 3代碼的源兼容性,并努力實(shí)現(xiàn)ABI穩(wěn)定性。下面這篇文章主要給大家介紹了關(guān)于swift 4.0中private所發(fā)生的一些變化,需要的朋友可以參考下。
    2017-12-12
  • 分享十條實(shí)用的Swift小提示

    分享十條實(shí)用的Swift小提示

    是時(shí)候使用易入手又全面的Swif語(yǔ)言為iOS和mac OS X做應(yīng)用開(kāi)發(fā)了,下面這篇文章主要給大家分享介紹了十條實(shí)用的Swift小提示的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-06-06
  • Swift UILable 設(shè)置內(nèi)邊距實(shí)例代碼

    Swift UILable 設(shè)置內(nèi)邊距實(shí)例代碼

    本文主要介紹Swift UILable 設(shè)置內(nèi)邊距,這里提供示例代碼供大家參考,有需要的小伙伴可以看下
    2016-07-07

最新評(píng)論

台湾省| 东乡| 桓仁| 沛县| 兰西县| 寻乌县| 保靖县| 祁阳县| 灵川县| 广昌县| 靖江市| 铁岭县| 定襄县| 天柱县| 揭阳市| 柳河县| 墨竹工卡县| 海晏县| 崇信县| 施甸县| 黄石市| 清水河县| 文安县| 成都市| 虎林市| 铜川市| 东乌珠穆沁旗| 新津县| 北京市| 全南县| 岳池县| 肥乡县| 东至县| 龙川县| 五峰| 莱西市| 和政县| 滁州市| 洪江市| 金沙县| 图木舒克市|