一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Swift - Swift縮放并填充圖片功能的實(shí)現(xiàn)

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

2021-12-26 17:36我為雙魚狂 Swift

最近有一個(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è)畫布,你甚至可以用它來(lái)涂鴉。

最近有一個(gè)需求,就是將圖片先等比例縮放到指定大小,然后將空余出來(lái)空間填充為黑色,返回指定大小的圖片。

這種直接操作圖片的需求,就要考慮使用 UIGraphicsBeginImageContext 函數(shù)實(shí)現(xiàn)。它可以理解為一個(gè)畫布,我們只需要把圖片放在畫布的對(duì)應(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)容,將視圖寫入到新的圖像對(duì)象
      let newImage = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()
      return newImage
  }

看代碼,總結(jié)出邏輯很簡(jiǎn)單,就是首先根據(jù)目標(biāo)的 size 來(lái)計(jì)算出需要縮放的比例(按照最大邊來(lái)處理),計(jì)算出圖片在畫布中的對(duì)應(yīng)位置和縮放后的寬高。

最后就是重頭戲,調(diào)用 UIGraphicsBeginImageContext 來(lái)繪畫。這里要留意幾個(gè)參數(shù)的設(shè)置:

  • UIGraphicsBeginImageContext(targetSize) 中的 targetSize 是設(shè)置畫布的大小。
  • image.draw(in:) 是圖片在畫布中的 rect 。
  • context 是畫布的對(duì)象
  • context?.setFillColor(_) 是設(shè)置畫布的顏色,若不設(shè)置,默認(rèn)為 black(黑色)
  • context?.fill()是設(shè)置畫布填充的 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)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/shsuper/p/15497212.html

延伸 · 閱讀

精彩推薦
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網(wǎng)上上看到的答案,復(fù)制粘貼過(guò)來(lái)和大家分享一下,因?yàn)槲液秃芏嗳艘粯雍荜P(guān)心Swift的出現(xiàn)對(duì)Mac開(kāi)發(fā)的影響和對(duì)Objective-C的影響。...

    Swift教程網(wǎng)4412020-12-16
  • SwiftSwift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果

    Swift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Swift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    Stevin的技術(shù)博客12372021-01-13
  • SwiftSwift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果

    Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
  • Swiftswift where與匹配模式的實(shí)例詳解

    swift where與匹配模式的實(shí)例詳解

    這篇文章主要介紹了swift where與匹配模式的實(shí)例詳解的相關(guān)資料,這里附有簡(jiǎn)單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢(mèng)的魔術(shù)師14382021-01-06
  • SwiftSwift中轉(zhuǎn)義閉包示例詳解

    Swift中轉(zhuǎn)義閉包示例詳解

    在Swift 中的閉包類似于結(jié)構(gòu)塊,并可以在任何地方調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Swift中轉(zhuǎn)義閉包的相關(guān)資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift的74個(gè)常用內(nèi)置函數(shù)介紹

    Swift的74個(gè)常用內(nèi)置函數(shù)介紹

    這篇文章主要介紹了Swift的74個(gè)常用內(nèi)置函數(shù)介紹,這篇文章列舉出了所有的Swift庫(kù)函數(shù),內(nèi)置函數(shù)是指無(wú)需引入任何模塊即可以直接使用的函數(shù),需要的朋友可...

    Swift教程網(wǎng)5802020-12-19
  • Swiftmac git xcrun error active developer path 錯(cuò)誤

    mac git xcrun error active developer path 錯(cuò)誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時(shí),出現(xiàn)了錯(cuò)誤(mac git xcrun error active developer path)的解決辦法,希望對(duì)大家有所幫助...

    Swift教程網(wǎng)2232020-12-16
  • SwiftSwift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類型和基本語(yǔ)法,例如常量和變量、注釋、分號(hào)、整數(shù)、數(shù)值類型轉(zhuǎn)換等...

    Swift教程網(wǎng)5162020-12-18
主站蜘蛛池模板: 日韩欧美亚洲一区精选 | 天天做日日做 | 国产精品一区三区 | 99爱免费视频 | 国产香蕉国产精品偷在线观看 | 青青五月天 | 乌克兰17一18处交 | 久久久精品免费视频 | 无限韩国视频免费播放 | 国产日韩欧美一区 | 国产123区| 欧美久在线观看在线观看 | 亚洲国产精品久久久久久 | 俺去啦最新 | 欧美色综合高清免费 | 双性肉文高h | 翁公与小莹在客厅激情 | xxoosex久久久久久 | 91果冻制片厂天美传媒 | 激情艳妇 | 日韩毛片大全免费高清 | 亚洲国产午夜看片 | 国产精品一级视频 | 久久热在线视频精品店 | 91在线精品老司机免费播放 | 四虎最新免费网址 | 91精品婷婷国产综合久久8 | 日本精品一区二区三区 | 狠狠色96视频| 国产51社区精品视频资源 | 国产亚洲精品aaa大片 | 999jjj在线播放 | 亚欧有色在线观看免费版高清 | www.麻豆视频| www.99精品| 国产特黄a级在线视频 | 双性总裁被调教1v1 双性双根 | 成年人免费在线看 | 日韩免费毛片视频杨思敏 | 九九精品视频在线免费观看 | 精品在线免费播放 |