UIImage, CGImageRef, CIImage

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

UIImage

概述:

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

你可以使用Image對象做如下操作:

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

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

圖片比較

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

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

訪問Image的數(shù)據(jù)

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


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

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

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

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

Discussion

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

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

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

Special Considerations

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


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

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

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

Discussion

該方法并不會緩存圖片


通過CGImage創(chuàng)建

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

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

Parameters

cgImage : Quartz Image對象

Return Value

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

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

通過CIImage創(chuàng)建

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

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

Parameters

ciImage : 用來封裝的Core Image對象

Return Value

返回一個新的圖片對象


Image的屬性

imageOrientation
@property(nonatomic, readonly) UIImageOrientation imageOrientation

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

Discussion

圖片的方向會影響圖片數(shù)據(jù)進行繪制時的方式. 默認(rè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
    圖片順時針旋轉(zhuǎn)90度.
    UIImageOrientationLeft
  • UIImageOrientationRight
    圖片逆時針旋轉(zhuǎn)90度.


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


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


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


    UIImageOrientationLeftMirrored
  • UIImageOrientationRightMirrored
    以UIImageOrientationRight方向進行繪制圖片的鏡面反射版本. 相當(dāng)于將"Up"方向圖片沿著Y軸水平翻轉(zhuǎn), 再順時針旋轉(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

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


size
@property(nonatomic, readonly) CGSize size

圖片的邏輯尺寸, 以點為單位進行測量. (只讀屬性)

Discussion

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


CGImage

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


CIImage

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方文檔點藍色文字:UIImage、CIImage、CGImage。 這篇文章是對官方文檔的學(xué)習(xí)筆記,不是翻譯,對...
    阿斯蘭iOS閱讀 6,727評論 1 8
  • 許多UIView的子類,如一個UIButton或一個UILabel,它們知道怎么繪制自己。遲早,你也將想要做一些自...
    shenzhenboy閱讀 1,756評論 2 8
  • Core Image是一個強大的框架,它能夠讓你輕松地對圖像進行過濾。你能夠通過修改圖像的飽和度、色調(diào)或曝光率來獲...
    木易林1閱讀 1,209評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,422評論 4 61
  • 前言 最近在研究 Core Image 自定義 Filter 相關(guān)內(nèi)容,重新學(xué)習(xí)了 Core Image,對 Co...
    泥孩兒0107閱讀 882評論 0 4

友情鏈接更多精彩內(nèi)容