core image圖像處理和分析技術门躯,用于為core graphics, core video和image I/O框架提供圖像操作。它涉及到的主要是3個角色類:
CIFilter: 可變類焰情,用于代表某種特定的處理效果告嘲,需要接收至少一個輸入并產(chǎn)生一個輸出圖像
CIImage: 不可變的圖像類,可以通過合成數(shù)據(jù)壁榕,或者讀取文件慎恒,也可以通過獲取CIFilter對象的輸出來得到CIImage對象
CIContext: 它是core image用來繪制CIFilter所產(chǎn)生的目標圖像的地方的對象任内,這個上下文可以是基于CPU也可以是基于GPU
需要注意的是在第4步中,獲取的outputimage只是一份"recipe"(實際是將原始圖片處理成目標圖片所需要進行的計算)融柬,只有在真正需要將目標圖片渲染出來的時候(典型的是各Framework中用來在各上下文中將圖片繪制出來的帶render,drawimage,createimage字樣的方法)才會進行最終的渲染死嗦,比如第5步中的操作
filter用于標識處理的屬性,采用key-value的形式存儲丹鸿,key為常量越走,value為特定屬性類型的值
創(chuàng)建core image上下文
contextWithOptions創(chuàng)建的上下文并沒有實時性能,指定CPU還是GPU進行渲染可以使用kCIContextUseSoftwareRenderer屬性設置不同的bool值靠欢,使用GPU渲染更快廊敌,但使用GPU需要先將結果image拷貝到CPU中并轉換為比如UIImage之類的對象之后才能被顯示出來。
EAGL context類型的CIContext支持實時渲染门怪,且所渲染的圖像一直留存在GPU中骡澈,通常先需要創(chuàng)建一個EAGL上下文:
EAGLContext *myEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
對于實時繪制,顏色逼真度通常不需要關注掷空,同時也由于其會拖慢整個繪制的性能肋殴,可以通過將working color space設置為null以關閉顏色管理
NSDictionary *options = @{ kCIContextWorkingColorSpace : [NSNull null] };
CIContext *myContext = [CIContext contextWithEAGLContext:myEAGLContext options:options];
創(chuàng)建core image對象
hueAdjust = [CIFilter filterWithName:@"CIHueAdjust"];
iOS中囤锉,此時hueAdjust的各參數(shù)是初始化為默認值的,但OS X不是护锤。hueAdjust有兩個輸入?yún)?shù)官地,圖像和角度:角度指hue在HSV和HLS顏色空間中的位置,其值變化范圍為0到2π烙懦,0代表紅色驱入,2/3π弧度代表綠色,4/3π代表藍色氯析。
[hueAdjust setValue: myCIImage forKey: kCIInputImageKey];
[hueAdjust setValue: @2.094f forKey: kCIInputAngleKey];
當然也可以將上述寫法替換成
hueAdjust = [CIFilter filterWithName:@"CIHueAdjust"] keysAndValues:
kCIInputImageKey, myCIImage,
kCIInputAngleKey, @2.094f,
nil];
值得提出的是亏较,直到渲染才生成真正的像素可以選擇最優(yōu)的順序進行計算,比如先上色再縮小圖像會比先將圖像縮小再上色更費計算掩缓。
將結果繪制到屏幕上:
[myContext drawImage:result inRect:destinationRect fromRect:contextRect];
維持線程安全
CIContext和CIImage是不可更改的對象雪情,可在多線程之間共享,但CIFilter是可更改的你辣,所以不可以在多線程之間共享巡通,各線程自己應當創(chuàng)建自己的CIFilter對象。
串聯(lián)filter
gloom filter通過將圖像高亮的部分取消以使圖像黯淡
CIFilter *gloom = [CIFilter filterWithName:@"CIGloom"];
[gloom setDefaults];? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 1
[gloom setValue: result forKey: kCIInputImageKey];
[gloom setValue: @25.0f forKey: kCIInputRadiusKey];? ? ? ? // 2
[gloom setValue: @0.75f forKey: kCIInputIntensityKey];? ? ? // 3
result = [gloom valueForKey: kCIOutputImageKey];? ? ? ? ? ? // 4
每2步中舍哄,輸入半徑指定了效果的程度扁达,可在0到100之間變化,默認值為10
3 設置輸入密度為0.75蠢熄,它是一個標量值,在filter輸出和原始圖像之間指定了線性混合炉旷,變化區(qū)間為0~1.0, 默認值為1.0
bump distortion filter
CIBumpDistortion Filter在圖像中指定點處創(chuàng)建一個凸起签孔。
CIFilter *bumpDistortion = [CIFilter filterWithName:@"CIBumpDistortion"];? ? // 1
[bumpDistortion setDefaults];? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 2
[bumpDistortion setValue: result forKey: kCIInputImageKey];
[bumpDistortion setValue: [CIVector vectorWithX:200 Y:150]
forKey: kCIInputCenterKey];? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 3
[bumpDistortion setValue: @100.0f forKey: kCIInputRadiusKey];? ? ? ? ? ? ? ? // 4
[bumpDistortion setValue: @3.0f forKey: kCIInputScaleKey];? ? ? ? ? ? ? ? ? // 5
result = [bumpDistortion valueForKey: kCIOutputImageKey];
4 設置凸起半徑為100像素
5 設置輸入比例為3,輸入比例指定了效果的方向和量窘行,區(qū)間為-10~10饥追,默認為-0.5,0代表沒有效果罐盔,負值代表向外的凸起但绕,正值代表向內的凸起。
切換效果
切換(transition)通常用在幻燈片的切換或者視頻中場景的切換惶看,切換效果通常會需要一段時間捏顺,并需要設置一個定時器,接下來就是介紹如何設置定時器
transition filter需要做如下的任務:
1 創(chuàng)建切換需要的ciimage
2 創(chuàng)建并調度一個定時器
3 創(chuàng)建一個CIContext對象
4 創(chuàng)建 CIFilter對象
5 在OS X 中纬黎,需要設置filter的默認值
6 設置filter參數(shù)
7 設置處理的源圖片和目標圖片
8 計算時間
9 應用filter
10 繪制結果
11 重復8-10步走到切換結束
與單純的圖片filter不同的是幅骄,切換filter需要在切換過程中的多個時間段內重復繪制效果
在初始的時候啟動一個定時器,在drawRect中添加繪制過渡圖像的方法本今,具體做法是以根據(jù)時間流逝的長度拆座,取一個參數(shù)值主巍,設置CICopyMachineTransition filter的kCIInputTimeKey,并將結果串聯(lián)到CICrop filter中挪凑,將串聯(lián)的結果繪制出來孕索。同時在每次timeout的時候均setNeedsDisplay
具體可以參考core image program guide>processing images 相應部分
為視頻添加Filter
core image和core video協(xié)同可以產(chǎn)生很多效果,比如可以使用一個顏色修正filter以修正水吸收紅色比綠色和藍色更快的問題躏碳。
具體可以參考core image program guide>processing images 相應部分