CIImage(process img)

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

iOS中使用filter

需要注意的是在第4步中,獲取的outputimage只是一份"recipe"(實際是將原始圖片處理成目標圖片所需要進行的計算)融柬,只有在真正需要將目標圖片渲染出來的時候(典型的是各Framework中用來在各上下文中將圖片繪制出來的帶render,drawimage,createimage字樣的方法)才會進行最終的渲染死嗦,比如第5步中的操作

filter用于標識處理的屬性,采用key-value的形式存儲丹鸿,key為常量越走,value為特定屬性類型的值

屬性值數(shù)據(jù)類型

創(chuàng)建core image上下文

上下文為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對象

從不同image來源創(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)通常用在幻燈片的切換或者視頻中場景的切換惶看,切換效果通常會需要一段時間捏顺,并需要設置一個定時器,接下來就是介紹如何設置定時器

由滑雪靴到滑雪者的copy machine 切換

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 相應部分

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末搞旭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唐断,更是在濱河造成了極大的恐慌选脊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脸甘,死亡現(xiàn)場離奇詭異恳啥,居然都是意外死亡,警方通過查閱死者的電腦和手機丹诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門钝的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铆遭,你說我怎么就攤上這事硝桩。” “怎么了枚荣?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵碗脊,是天一觀的道長。 經(jīng)常有香客問我橄妆,道長衙伶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任害碾,我火速辦了婚禮矢劲,結果婚禮上,老公的妹妹穿的比我還像新娘慌随。我一直安慰自己芬沉,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布阁猜。 她就那樣靜靜地躺著丸逸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹦漠。 梳的紋絲不亂的頭發(fā)上椭员,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音笛园,去河邊找鬼隘击。 笑死侍芝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的埋同。 我是一名探鬼主播州叠,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凶赁!你這毒婦竟也來了咧栗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虱肄,失蹤者是張志新(化名)和其女友劉穎致板,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咏窿,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡斟或,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了集嵌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萝挤。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖根欧,靈堂內的尸體忽然破棺而出怜珍,到底是詐尸還是另有隱情,我是刑警寧澤凤粗,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布酥泛,位于F島的核電站,受9級特大地震影響嫌拣,放射性物質發(fā)生泄漏揭璃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一亭罪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歼秽,春花似錦应役、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肆氓,卻和暖如春袍祖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谢揪。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工蕉陋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捐凭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓凳鬓,卻偏偏與公主長得像茁肠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缩举,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容