iOS5新特性:強大的Core Image

OS5給我們帶來了很多很好很強大的功能和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 = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
NSURL *fileNameAndPath = [NSURL fileURLWithPath: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:[NSNumber numberWithFloat: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種效果。

原帖地址:http://www.cocoachina.com/bbs/read.php?tid=82619

CoreImage

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章