UIImage, CGImageRef, CIImage

后繼更新... 2016-05-24

UIImage

概述:

UIImage對(duì)象在App中管理圖片數(shù)據(jù). 使用Image對(duì)象來(lái)表示所有類型圖片的數(shù)據(jù), UIImage類具有管理相關(guān)平臺(tái)支持的所有格式圖片數(shù)據(jù)的能力. Image對(duì)象是不可修改的, 因此你總是通過(guò)已經(jīng)存在的圖片數(shù)據(jù)來(lái)創(chuàng)建它, 比如保存在硬件中的圖片文件或通過(guò)編程創(chuàng)建的圖片數(shù)據(jù). 一個(gè)Image對(duì)象包含單個(gè)圖片或你要用作動(dòng)畫(huà)的一系列圖片.

你可以使用Image對(duì)象做如下操作:

  1. 為UIImageView對(duì)象訪問(wèn)圖片以便在界面上展示出來(lái)
  2. 使用圖片來(lái)自定義系統(tǒng)操作, 如按鈕(Button), 滾動(dòng)條(Slider)和分段管理(Segment)
  3. 直接在View或者其它圖形上下文中繪抽圖片
  4. 傳遞Image給其它需要圖片數(shù)據(jù)的API

盡管Image對(duì)象支持本地平臺(tái)的所有圖片格式, 但仍推薦App盡量使用PNG或JPEG格式的圖片. Image對(duì)象針對(duì)PNG和JPEG格式進(jìn)行了渲染和顯示的優(yōu)化, 相比其它格式的圖片提供了更好的性能. 因?yàn)镻NG格式是無(wú)損的, 所以特別推薦在App的界面中使用該格式的圖片.

圖片比較

isEqual: 方法是判斷兩個(gè)圖片的圖片數(shù)據(jù)是否相同的唯一可靠方法. 即使通過(guò)同樣的圖片數(shù)據(jù)緩存來(lái)創(chuàng)建的Image對(duì)象也有可能是不同的. 唯一能判斷它們是否相同的方式是使用 isEqual: 方法, 通過(guò)比較真實(shí)的圖片數(shù)據(jù).

// 加載同一張圖片兩次
UIImage* image1 = [UIImage imageNamed:@"MyImage"];
UIImage* image2 = [UIImage imageNamed:@"MyImage"];
 
// image對(duì)象是不同的, 但是它們的內(nèi)容是一樣的
if ([image1 isEqual:image2]) {
   // 直接對(duì)比兩張圖片的數(shù)據(jù)
}
 
if (image1 == image2) {
   // 直接進(jìn)行比較是無(wú)效的, 并沒(méi)有對(duì)圖片數(shù)據(jù)進(jìn)行對(duì)比
}

訪問(wèn)Image的數(shù)據(jù)

Image對(duì)象并沒(méi)有提供直接訪問(wèn)相關(guān)的圖片數(shù)據(jù)的操作. 然而, 你可以取得其它格式的圖片數(shù)據(jù)給App使用. 特別的, 你可以分別使用CGImage和CIImage屬性獲取兼容Core Graphics和Core Image的版本的圖片. 你也可以使用UIImagePNGRepresentation和UIImageJPEGRepressentation功能來(lái)生成包含PNG或JPEG的圖片數(shù)據(jù)的NSData對(duì)象.


創(chuàng)建UIImage的幾種常見(jiàn)方式

根據(jù)圖片名創(chuàng)建

Description
+ (UIImage *)imageNamed:(NSString *)name
Parameters

name : 圖片文件的名字, 如果是第一次加載該圖片, 該方法會(huì)在應(yīng)用的Main Bundle當(dāng)中查找指定名字的文件. 如果是PNG圖片, 可以省略文件后綴名. 其它格式的文件需要寫(xiě)完整的名稱

Discussion

該訪求查找系統(tǒng)緩存的指定名字的圖片對(duì)象并返回最適合當(dāng)前屏幕的該圖片的變量. 如果緩存中并沒(méi)有匹配的圖片對(duì)象, 該方法會(huì)定位并加載硬件或有效的資源目錄中該圖片的數(shù)據(jù), 并返回結(jié)果對(duì)象.

系統(tǒng)可能在任意時(shí)刻去清除圖片緩存數(shù)據(jù)以釋放內(nèi)存. 緩存的圖片數(shù)據(jù)中只有當(dāng)前沒(méi)有被使用的會(huì)被清除

在iOS9及以后, 該方法是線程安全.

Special Considerations

如果你的圖片文件只需要顯示一次并確保它不需要添加到系統(tǒng)的緩存當(dāng)中. 你應(yīng)該使用 imageWithContentsOfFile: 方法來(lái)創(chuàng)建圖片. 這會(huì)讓單次使用的圖片不會(huì)被系統(tǒng)緩存, 從而潛在的提高App內(nèi)存使用的特性.


通過(guò)圖片路徑創(chuàng)建

Description
+ (UIImage *)imageWithContentsOfFile:(NSString *)path
Parameters

path : 文件的局部或完整路徑

Discussion

該方法并不會(huì)緩存圖片


通過(guò)CGImage創(chuàng)建

Description
+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage

創(chuàng)建并返回與指定的Quartz圖片所對(duì)應(yīng)的UIImage圖片對(duì)象

Parameters

cgImage : Quartz Image對(duì)象

Return Value

返回與指定Quartz Image對(duì)應(yīng)的新UIImage對(duì)象, 如果不能從指定的Quartz Image引用進(jìn)行初始化, 則返回nil

Discussion
 該方法會(huì)不緩存圖片對(duì)象. 可以使用Core Graphics框架中對(duì)應(yīng)方法來(lái)創(chuàng)建Quartz圖片引用

通過(guò)CIImage創(chuàng)建

Description
+ (UIImage *)imageWithCIImage:(CIImage *)ciImage

創(chuàng)建并返回包含Core Image對(duì)象的UIImage對(duì)象

Parameters

ciImage : 用來(lái)封裝的Core Image對(duì)象

Return Value

返回一個(gè)新的圖片對(duì)象


Image的屬性

imageOrientation
@property(nonatomic, readonly) UIImageOrientation imageOrientation

圖片的方向. (只讀屬性)

Discussion

圖片的方向會(huì)影響圖片數(shù)據(jù)進(jìn)行繪制時(shí)的方式. 默認(rèn)情況下, 圖片是"向上"的方向進(jìn)行展示的. 如果圖片有與之關(guān)聯(lián)的元數(shù)據(jù)(metadata)(比如EXIF信息), 則該屬性包含了元數(shù)據(jù)所指示的方向. 該屬性的可用參數(shù)類型列表, 可以查看UIImageOrientation

typedef enum {
   UIImageOrientationUp,
   UIImageOrientationDown , 
   UIImageOrientationLeft ,   
   UIImageOrientationRight ,  
   UIImageOrientationUpMirrored ,  
   UIImageOrientationDownMirrored ,  
   UIImageOrientationLeftMirrored , 
   UIImageOrientationRightMirrored , 
} UIImageOrientation;
  • UIImageOrientationUp
    默認(rèn)的圖片方向, 圖片正面朝上繪制.


    UIImageOrientationUp
  • UIImageOrientationDown
    圖片旋轉(zhuǎn)180度.


    UIImageOrientationDown
  • UIImageOrientationLeft
    圖片順時(shí)針旋轉(zhuǎn)90度.
    UIImageOrientationLeft
  • UIImageOrientationRight
    圖片逆時(shí)針旋轉(zhuǎn)90度.


    UIImageOrientationRight
  • UIImageOrientationUpMirrored
    以UIImageOrientationUp方向進(jìn)行繪制圖片的鏡面反射版本. 也就是沿著Y軸進(jìn)行水平翻轉(zhuǎn).


    UIImageOrientationUpMirrored
  • UIImageOrientationDownMirrored
    以UIImageOrientationDown方向進(jìn)行繪制圖片的鏡面反射版本. 也就是沿著Y軸進(jìn)行水平翻轉(zhuǎn).


    UIImageOrientationDownMirrored.jpg
  • UIImageOrientationLeftMirrored
    以UIImageOrientationLeft方向進(jìn)行繪制圖片的鏡面反射版本. 相當(dāng)于將"Up"方向圖片沿著Y軸水平翻轉(zhuǎn), 再逆時(shí)針旋轉(zhuǎn)90.


    UIImageOrientationLeftMirrored
  • UIImageOrientationRightMirrored
    以UIImageOrientationRight方向進(jìn)行繪制圖片的鏡面反射版本. 相當(dāng)于將"Up"方向圖片沿著Y軸水平翻轉(zhuǎn), 再順時(shí)針旋轉(zhuǎn)90.


    UIImageOrientationRightMirrored
EXIF(Exchangeable Image File Format)

可交換圖像文件格式, 可記錄照片的屬性信息(寬度, 高度, 方向等)和拍攝數(shù)據(jù)(圖片數(shù)據(jù)). EXIF可附加于JPEG, TIFF, RIFF等文件之中, 但PNG格式的圖像不包含.


scale
@property(nonatomic, readonly) CGFloat scale

圖片的拉伸系數(shù). (只讀屬性)

Discussion

如果你從一個(gè)名稱包含@2X修飾的文件中加載圖片, 則scale會(huì)被設(shè)置成2.0. 你也可以在從Core Graphics Image初始化一張圖片時(shí)直接顯式的指定拉伸系數(shù)(scale factor). 所有其它的圖片都假定其拉伸系數(shù)為1.0.
如果你將圖片的邏輯尺寸(保存在size屬性中)乘以拉伸比例(scale屬性), 會(huì)得到圖片實(shí)際的像素尺寸.


size
@property(nonatomic, readonly) CGSize size

圖片的邏輯尺寸, 以點(diǎn)為單位進(jìn)行測(cè)量. (只讀屬性)

Discussion

該值表示圖片的邏輯大小, 并將圖片當(dāng)前方向考慮進(jìn)去. 將size的值乘以scale屬性的值可以得到圖片的像素尺寸.


CGImage

CGImageRef是一種基于你所提供的樣本數(shù)據(jù)來(lái)表示位圖(Bitmap Image)和位圖遮罩(Bitmap Image Masks)的具體類型. 位圖(樣本)是像素的矩形陣列(Rectangular Array), 每個(gè)像素表示源圖中的每個(gè)點(diǎn)的數(shù)據(jù)或樣本.


CIImage

CIImage類用于描述一張圖片. CoreImage的圖片是不可變的. 通過(guò)將CIImage對(duì)象與其它Core Image的類(比如CIFilter, CIContext, CIVector, 和CIColor)結(jié)合, 實(shí)現(xiàn)利用Core Image內(nèi)建的濾鏡來(lái)進(jìn)行圖片處理. 根據(jù)多種來(lái)源提供的數(shù)據(jù)來(lái)創(chuàng)建CIImage對(duì)象, 包括Quartz 2D, Core Video圖像緩存(CVImageBufferRef), 基于URL的對(duì)象, 和NSData對(duì)象.
盡管CIImage對(duì)象擁有與之關(guān)聯(lián)的圖片數(shù)據(jù), 但本質(zhì)上并不是一張圖片. 你可以它CIImage對(duì)象為一個(gè)圖片的"配方". CIImage對(duì)象擁有生成一張圖片所具備的所有信息, 但Core Image并不會(huì)真正的去渲染一張圖片, 除非被要求這么做. 這種"延遲計(jì)算(lzay evaluation)"方式讓Core Image的操作盡可能的高效.
CIContext和CIImage對(duì)象都是不可修改的, 意味著它們可以在線程之間安全的共享. 多個(gè)線程可以使用同樣的GPU或者CPU的CIContext對(duì)象來(lái)渲染CIImage對(duì)象. 然而, CIFilter對(duì)象的情況則不同, 它是可以被修改的. CIFilter對(duì)象不能在線程之間安全的共享. 如果你的App是支持多線程的, 每一個(gè)線程都需要?jiǎng)?chuàng)建自己的CIFilter對(duì)象. 否則App的行為將出乎你的意料.
Core Image提供了為圖片分析常見(jiàn)缺陷并自動(dòng)調(diào)整修復(fù)的方法. 提供一系列用來(lái)糾正這些不足的濾鏡. 通過(guò)為濾鏡預(yù)設(shè)相關(guān)值, 實(shí)現(xiàn)如變更色調(diào), 飽合度, 對(duì)比度, 陰影, 去除紅眼或其它閃光偽跡, 來(lái)提高圖片的質(zhì)量.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绽左,一起剝皮案震驚了整個(gè)濱河市丹弱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辜王,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉讯,死亡現(xiàn)場(chǎng)離奇詭異竿拆,居然都是意外死亡嚣崭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)懦傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雹舀,“玉大人,你說(shuō)我怎么就攤上這事粗俱∷涤埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵寸认,是天一觀的道長(zhǎng)签财。 經(jīng)常有香客問(wèn)我,道長(zhǎng)废麻,這世上最難降的妖魔是什么荠卷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮烛愧,結(jié)果婚禮上油宜,老公的妹妹穿的比我還像新娘。我一直安慰自己怜姿,他們只是感情好慎冤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著沧卢,像睡著了一般蚁堤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上但狭,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天披诗,我揣著相機(jī)與錄音,去河邊找鬼立磁。 笑死呈队,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唱歧。 我是一名探鬼主播宪摧,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颅崩!你這毒婦竟也來(lái)了几于?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沿后,失蹤者是張志新(化名)和其女友劉穎沿彭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體得运,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膝蜈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锅移,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熔掺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饱搏。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖置逻,靈堂內(nèi)的尸體忽然破棺而出推沸,到底是詐尸還是另有隱情,我是刑警寧澤券坞,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布鬓催,位于F島的核電站,受9級(jí)特大地震影響恨锚,放射性物質(zhì)發(fā)生泄漏宇驾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一猴伶、第九天 我趴在偏房一處隱蔽的房頂上張望课舍。 院中可真熱鬧,春花似錦他挎、人聲如沸筝尾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筹淫。三九已至,卻和暖如春呢撞,著一層夾襖步出監(jiān)牢的瞬間损姜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工殊霞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摧阅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓脓鹃,卻偏偏與公主長(zhǎng)得像逸尖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘸右,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 官方文檔點(diǎn)藍(lán)色文字:UIImage娇跟、CIImage、CGImage太颤。 這篇文章是對(duì)官方文檔的學(xué)習(xí)筆記苞俘,不是翻譯,對(duì)...
    阿斯蘭iOS閱讀 6,400評(píng)論 1 8
  • 許多UIView的子類龄章,如一個(gè)UIButton或一個(gè)UILabel吃谣,它們知道怎么繪制自己乞封。遲早,你也將想要做一些自...
    shenzhenboy閱讀 1,626評(píng)論 2 8
  • Core Image是一個(gè)強(qiáng)大的框架岗憋,它能夠讓你輕松地對(duì)圖像進(jìn)行過(guò)濾肃晚。你能夠通過(guò)修改圖像的飽和度、色調(diào)或曝光率來(lái)獲...
    木易林1閱讀 1,125評(píng)論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)仔戈、插件关串、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 前言 最近在研究 Core Image 自定義 Filter 相關(guān)內(nèi)容,重新學(xué)習(xí)了 Core Image监徘,對(duì) Co...
    泥孩兒0107閱讀 755評(píng)論 0 4