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種效果:
原圖:
舊照片:
色彩:
旋轉:
示例代碼:
CoreImage.zip (868 K) 下載下傳次數:0
小技巧:有同學可能想換張圖檔試試,但使用模拟器的同學打開圖檔庫時裡面是空的吧,你在模拟器裡打開Safari,在網上找到你想要的圖檔,長按會彈出問你要不要儲存,選儲存後再打開圖檔庫裡面就有圖檔了。