天天看點

iOS5新特性:Core Image 圖檔處理的強力架構

iOS5給我們帶來了很多很好很強大的功能和API。Core Image就是其中之一,它使我們很容易就能處理圖檔的各種效果,色彩啊,曝光啊,飽和度啊,變形啊神馬的。

可惜蘋果一直沒能完善官方文檔,也沒有推出示例代碼,是以國内很多同學可能還沒有開始使用。

但國外的大神們已經證明這是個相當強悍的架構,不僅功能強大,而且可以直接使用GPU,效率奇高,甚至可以實時的對視訊進行渲染。

下面讓我們來看看,如何具體使用它:

首先你需要導入 CoreImage.framework 架構;進行Mac(不是iOS)開發的同學請導入 QuartzCore.framework 架構,包含在其中了。

然後我們先來看看3個主要的類:

CIContext:它與Core Graphics 和 OpenGL context類似,所有Core Image的處理流程都通過它來進行;

CIImage:它用來存放圖檔資料,可以通過UIImage,圖檔檔案或像素資料建立;

CIFilter:通過它來定義過濾器的詳細屬性。

CIContext有兩種初始化方法,分别對應GPU和CPU

?

// 建立基于GPU的CIContext對象
context = [CIContext contextWithOptions: nil];
    
// 建立基于CPU的CIContext對象
//context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];
           

一般采用第一種基于GPU的,因為效率要比CPU高很多,但是要注意的是基于GPU的CIContext對象無法跨 應用通路。

比如你打開UIImagePickerController要選張照片進行美化,如果你直接在UIImagePickerControllerDelegate的委托方法裡調用CIContext對象進行處理,那麼系統會自動将其降為基于CPU的,速度會變慢,是以正确的方法應該是在委托方法裡先把照片儲存下來,回到主類裡再來處理。(代碼裡你将會看到)

CIImage的初始化方法有很多,常用的也是2種:

?

// 通過圖檔路徑建立CIImage
NSString*filePath = [[NSBundlemainBundle] pathForResource:@"image"ofType:@"png"];
NSURL*fileNameAndPath = [NSURLfileURLWithPath:filePath];
beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];
 
// 通過UIImage對象建立CIImage
UIImage *gotImage = ...;
beginImage = [CIImage imageWithCGImage:gotImage.CGImage];
           

CIFilter初始化:

?

// 建立過濾器
filter = [CIFilter filterWithName:@"CISepiaTone"];
[filter setValue:beginImage forKey:kCIInputImageKey];
[filter setValue:[NSNumbernumberWithFloat:slideValue] forKey:@"inputIntensity"];
           

第一行:指定使用哪一個過濾器,通過[CIFilter filterNamesInCategory: kCICategoryBuiltIn]能得到所有過濾器的清單

第二行:指定需要處理的圖檔

第三行:指定過濾參數,每個過濾器的參數都不一樣,可以在官方文檔裡搜尋“Core Image Filter Reference”檢視

得到過濾後的圖檔并輸出:

?

CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];    
[imgV setImage:newImg];
CGImageRelease(cgimg);
           

第一行:通過[filter outputImage]可以得到過濾器輸出的圖檔

第二行:通過CIContext的方法createCGImage: fromRect:得到CGImage

第三行:轉化為UIImage,這樣我們就可以跟據需要 顯示 在界面上了

至此一個過濾周期就完成了,簡單來說分以下幾個步驟:

1 初始化CIContext,CIImage

2 初始化CIFilter并設定參數

3 得到輸出的圖檔

4 将圖檔轉化成能顯示的UIImage類型

如果想一張圖檔有多種過濾效果就需要重複2,3兩步,并且要将上一個過濾器輸出的圖檔作為下一個過濾器的參數

簡單吧!幾行代碼就可以得到豐富的效果哦,我在代碼裡實作了3種效果:

原圖:

iOS5新特性:Core Image 圖檔處理的強力架構

舊照片:

iOS5新特性:Core Image 圖檔處理的強力架構

色彩:

iOS5新特性:Core Image 圖檔處理的強力架構

旋轉:

iOS5新特性:Core Image 圖檔處理的強力架構

示例代碼: 

iOS5新特性:Core Image 圖檔處理的強力架構

 CoreImage.zip (868 K) 下載下傳次數:0 

小技巧:有同學可能想換張圖檔試試,但使用模拟器的同學打開圖檔庫時裡面是空的吧,你在模拟器裡打開Safari,在網上找到你想要的圖檔,長按會彈出問你要不要儲存,選儲存後再打開圖檔庫裡面就有圖檔了。

繼續閱讀