后繼更新... 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ì)象做如下操作:
- 為UIImageView對(duì)象訪問(wèn)圖片以便在界面上展示出來(lái)
- 使用圖片來(lái)自定義系統(tǒng)操作, 如按鈕(Button), 滾動(dòng)條(Slider)和分段管理(Segment)
- 直接在View或者其它圖形上下文中繪抽圖片
- 傳遞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)的圖片方向, 圖片正面朝上繪制.
-
UIImageOrientationDown
圖片旋轉(zhuǎn)180度.
- UIImageOrientationLeft
圖片順時(shí)針旋轉(zhuǎn)90度.
-
UIImageOrientationRight
圖片逆時(shí)針旋轉(zhuǎn)90度.
-
UIImageOrientationUpMirrored
以UIImageOrientationUp方向進(jìn)行繪制圖片的鏡面反射版本. 也就是沿著Y軸進(jìn)行水平翻轉(zhuǎn).
-
UIImageOrientationDownMirrored
以UIImageOrientationDown方向進(jìn)行繪制圖片的鏡面反射版本. 也就是沿著Y軸進(jìn)行水平翻轉(zhuǎn).
-
UIImageOrientationLeftMirrored
以UIImageOrientationLeft方向進(jìn)行繪制圖片的鏡面反射版本. 相當(dāng)于將"Up"方向圖片沿著Y軸水平翻轉(zhuǎn), 再逆時(shí)針旋轉(zhuǎn)90.
-
UIImageOrientationRightMirrored
以UIImageOrientationRight方向進(jìn)行繪制圖片的鏡面反射版本. 相當(dāng)于將"Up"方向圖片沿著Y軸水平翻轉(zhuǎn), 再順時(shí)針旋轉(zhuǎn)90.
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ì)量.