SwiftUI Image如何使用UIImage CGImage CIImage

蘋(píng)果提供的圖片對(duì)象

  • UIImage沃但,它來(lái)自UIKit线召。這是一種非常強(qiáng)大的圖像類(lèi)型平痰,能夠處理各種圖像類(lèi)型揣苏,包括位圖(如PNG),矢量(如SVG)君珠,甚至是形成動(dòng)畫(huà)的序列八千。 UIImage是UIKit的標(biāo)準(zhǔn)圖像類(lèi)型丈咐,在三種類(lèi)型中闲孤,它最接近SwiftUI的圖像類(lèi)型谆级。
  • CGImage,來(lái)自Core Graphics讼积。這是一種更簡(jiǎn)單的圖像類(lèi)型,實(shí)際上只是一個(gè)二維像素陣列脚仔。
  • CIImage勤众,來(lái)自Core Image。它將存儲(chǔ)生成圖像所需的所有信息鲤脏,但實(shí)際上不會(huì)將其轉(zhuǎn)換為像素(除非要求)们颜。蘋(píng)果將??CIImage稱(chēng)為“圖像配方”,而不是實(shí)際圖像猎醇。

各種圖像類(lèi)型之間存在一些互操作性

  • 我們可以從CGImage創(chuàng)建UIImage窥突,并從UIImage創(chuàng)建CGImage。
  • 我們可以從UIImage和CGImage創(chuàng)建CIImage硫嘶,也可以從CIImage創(chuàng)建CGImage阻问。
  • 我們可以從UIImage和CGImage創(chuàng)建一個(gè)SwiftUI圖像。

SwiftUI和圖像們的關(guān)系

這些圖像類(lèi)型是純數(shù)據(jù)對(duì)象沦疾,我們無(wú)法將它們放入SwiftUI視圖層次結(jié)構(gòu)中称近,但是我們可以自由地對(duì)其進(jìn)行操作,然后將結(jié)果呈現(xiàn)在SwiftUI圖像中哮塞。

我們將更改loadImage()刨秆,以便它從示例圖像中創(chuàng)建一個(gè)UIImage,然后使用Core Image對(duì)其進(jìn)行操作忆畅。更具體地說(shuō)衡未,我們將從兩項(xiàng)任務(wù)開(kāi)始:

func loadImage() {
    guard let inputImage = UIImage(named: "Example") else { return }
 // 將UIImage轉(zhuǎn)換為CIImage
    let beginImage = CIImage(image: inputImage)

    // 下面我們可以使用Core Image庫(kù)進(jìn)行圖像處理
}

下一步將創(chuàng)建一個(gè)Core Image上下文和一個(gè)Core Image過(guò)濾器。過(guò)濾器是完成以某種方式轉(zhuǎn)換圖像數(shù)據(jù)的實(shí)際工作的東西,例如模糊缓醋,銳化如失,調(diào)整顏色等,上下文則將處理后的數(shù)據(jù)轉(zhuǎn)換為我們可以使用的CGImage改衩。

這兩種數(shù)據(jù)類(lèi)型均來(lái)自Core Image岖常,因此您需要添加兩次導(dǎo)入才能將其提供給我們。因此葫督,請(qǐng)先在ContentView.swift頂部附近添加以下內(nèi)容:

import CoreImage
import CoreImage.CIFilterBuiltins

接下來(lái)竭鞍,我們將創(chuàng)建上下文并進(jìn)行過(guò)濾。在此示例中橄镜,我們將使用棕褐色調(diào)濾鏡偎快,該濾鏡會(huì)應(yīng)用棕色調(diào),使照片看起來(lái)像是很久以前拍攝的洽胶。

因此晒夹,替換//更多代碼以對(duì)此進(jìn)行注釋?zhuān)?/p>

let context = CIContext()
let currentFilter = CIFilter.sepiaTone()

現(xiàn)在,我們可以自定義過(guò)濾器以更改其工作方式姊氓。棕褐色是一個(gè)簡(jiǎn)單的濾鏡丐怯,因此它只有兩個(gè)有趣的屬性:inputImage是我們要更改的圖像,而強(qiáng)度是應(yīng)該應(yīng)用棕褐色效果的強(qiáng)度翔横,在0(原始圖像)和1(完整棕褐色)的范圍內(nèi)指定读跷。

因此,在前兩行下面添加以下兩行代碼:

currentFilter.inputImage = beginImage
currentFilter.intensity = 1

所有這些都不是很難的禾唁,但是這里發(fā)生了改變:我們需要將過(guò)濾器的輸出轉(zhuǎn)換為可以在視圖中顯示的SwiftUI圖像效览。這是我們需要一次依靠所有四種圖像類(lèi)型的地方,因?yàn)樽詈?jiǎn)單的操作是:

從我們的過(guò)濾器讀取輸出圖像荡短,它將是CIImage丐枉。這可能會(huì)失敗,因此它返回一個(gè)可選掘托。
詢(xún)問(wèn)我們的上下文瘦锹,從該輸出圖像創(chuàng)建CGImage。這也可能會(huì)失敗烫映,因此再次返回一個(gè)可選沼本。
將該CGImage轉(zhuǎn)換為UIImage。
將該UIImage轉(zhuǎn)換為SwiftUI圖像锭沟。
您可以直接從CGImage轉(zhuǎn)到SwiftUI圖像抽兆,但它需要額外的參數(shù),并且只會(huì)增加更多的復(fù)雜性族淮!

這是loadImage()的最終代碼:

// get a CIImage from our filter or exit if that fails
guard let outputImage = currentFilter.outputImage else { return }

// attempt to get a CGImage from our CIImage
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
    // convert that to a UIImage
    let uiImage = UIImage(cgImage: cgimg)

    // and convert that to a SwiftUI image
    image = Image(uiImage: uiImage)
}

如果再次運(yùn)行該應(yīng)用程序辫红,您應(yīng)該會(huì)看到示例圖像現(xiàn)在已應(yīng)用了棕褐色效果凭涂,這全歸功于Core Image。

現(xiàn)在贴妻,您可能會(huì)認(rèn)為切油,要獲得一個(gè)相當(dāng)簡(jiǎn)單的結(jié)果,這是一件繁瑣的工作名惩,但是現(xiàn)在您已經(jīng)掌握了Core Image的所有基礎(chǔ)知識(shí)澎胡,因此切換到其他過(guò)濾器相對(duì)容易。

我們需要將示例圖像加載到UIImage中娩鹉,該圖像具有一個(gè)名為UIImage(name :)的初始化程序攻谁,以從資產(chǎn)目錄中加載圖像。它返回一個(gè)可選的UIImage弯予,因?yàn)槲覀兛赡苤付瞬淮嬖诘膱D像戚宦。
我們將其轉(zhuǎn)換為CIImage,這是Core Image想要使用的锈嫩。
因此受楼,首先用以下代碼替換當(dāng)前的loadImage()實(shí)現(xiàn):

推薦

基礎(chǔ)文章推薦

經(jīng)典教程推薦

技術(shù)源碼推薦

推薦文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技術(shù)交流

QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市对雪,隨后出現(xiàn)的幾起案子骚灸,更是在濱河造成了極大的恐慌,老刑警劉巖慌植,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異义郑,居然都是意外死亡蝶柿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)非驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)交汤,“玉大人,你說(shuō)我怎么就攤上這事劫笙≤皆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵填大,是天一觀的道長(zhǎng)戒洼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)允华,這世上最難降的妖魔是什么圈浇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任寥掐,我火速辦了婚禮,結(jié)果婚禮上磷蜀,老公的妹妹穿的比我還像新娘召耘。我一直安慰自己,他們只是感情好褐隆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布污它。 她就那樣靜靜地躺著,像睡著了一般庶弃。 火紅的嫁衣襯著肌膚如雪衫贬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天虫埂,我揣著相機(jī)與錄音祥山,去河邊找鬼。 笑死掉伏,一個(gè)胖子當(dāng)著我的面吹牛缝呕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斧散,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼供常,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鸡捐?” 一聲冷哼從身側(cè)響起栈暇,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箍镜,沒(méi)想到半個(gè)月后源祈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡色迂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年香缺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歇僧。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡图张,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诈悍,到底是詐尸還是另有隱情祸轮,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布侥钳,位于F島的核電站适袜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慕趴。R本人自食惡果不足惜痪蝇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一鄙陡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躏啰,春花似錦趁矾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至帝际,卻和暖如春蔓同,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹲诀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工斑粱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脯爪。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓则北,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親痕慢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚揣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354