Core Image程式設計指南

2021-07-22 13:56:02 字數 3668 閱讀 1950

1.    cifilter:乙個可變的物件代表乙個影響。乙個濾波物件至少有乙個輸入引數並且產生乙個輸出。

3.    cicontext:coreimage通過這個物件將濾波產生的結果畫出來。乙個core image上下文可以基於cpu或者是gpu。

overview

使用core image時需要在專案中加入框架coreimage.framework。並且在原始檔中引入相應的標頭檔案.

listing 1-1 在乙個上應用濾波的基本步驟

1.    建立乙個cicontext物件。

2.    建立乙個ciimage物件。

3.    建立乙個濾波物件並設定它的輸入引數。

4.    獲得輸出。這個輸出是怎樣產生的乙個方案。並沒有被渲染。

5.    渲染ciimage為乙個core graphics,來準備展示或者儲存到檔案。

note:一些core image濾波生成無限大的,例如在cicategorytileeffect目錄中的那些filters.在這種情況下,在渲染之前要不需要裁剪,要不指定乙個有限大小的矩形。

建立乙個coreimage context

為了渲染,需要建立乙個core image context,然後使用這個上下文來繪製輸出。乙個上下文代表乙個繪製目的地。這個目的地決定core image使用gpu還是cpu來渲染。下面的**指明指定平台的不同方法來渲染。

建立乙個coreimage context當你不需要實時的效能

cicontext *context = [cicontextcontextwithoptions:nil];

這個方法可以使用gpu,也可以使用cpu進行渲染。指明使用哪個,可以提供乙個options字典,增加關鍵字kcicontextusesoftwarerender,並使用合適的布林值賦值。cpu比gpu渲染要慢。但是在gpu渲染時,結果只有當被拷貝到cpu記憶體並且轉換為例如uiimage這種型別才會被展示出來。

建立乙個coreimage context當需要實時的效能

eaglcontext*myeaglcontext = [[eaglcontext alloc] initwithapi:keaglrenderingapiopengles2]

然後使用方法contextwitheaglcontext:建立乙個cicontext物件。

nsdictionary*options = @;

cicontext*mycontext = [cicontext contextwitheaglcontext:myeaglcontext options:options];

建立乙個ciimage物件

core image filter處理core image 。以下**列出了建立ciimage物件的方法。你使用的方法依賴於源。記住ciimage物件是乙個真正的的recipe。core image不會真正的產生任何畫素直到被呼叫到目的地去渲染結果

建立乙個濾波物件並且設定值

filterwithname:方法建立乙個型別為指定名字引數的濾波器。名字引數是乙個字串,這個值必須匹配內建濾波器的名字。可以在core image filter reference中找到所有的內建濾波器。

在ios中,當呼叫filterwithname:方法時,乙個濾波器的輸入值會被設定成預設值。

hueadjust = [cifilterfilterwithname:@」cihueadjust」];

//這個濾波器有兩個引數,乙個是輸入,乙個是輸入角度

[hueadjustsetvalue:myciimage forkey:kciinputimagekey];

[hueadjustsetvalue:@2.094f forkey:kciinputanglekey];

有乙個更緊湊的方式建立濾波器並且設定值:

hueadjust=[cifilter  filterwithname:@」cihueadjust」

withinputparameters:@];

獲得輸出

通過檢索outputimage的值來獲得輸出。

ciimage *result =[hueadjust valueforkey:kcioutputimagekey];

core image不會做任何處理直到呼叫真正的渲染方法時才會處理。當你請求乙個輸出,core image收集產生乙個輸出的計算結果並且儲存這些計算結果(這就是所謂的recipe)在乙個ciimage物件中。

推遲處理直到渲染時間是的core image快並且高效。在渲染的時候,core image可以看到是否有多個濾波器被應用在一張上。如果是這樣,它會自動連線多個recipes到乙個操作中,也就說乙個畫素僅處理一次。而且還會自動權衡應用濾波的順序來使得處理更高效(比如顏色調整和大小調整,相反順序處理起來會更加高效)。

渲染輸出

保持執行緒安全

連鎖濾波

result是list1-1中得到的輸出,此時作為新的濾波器的輸入。在ios中可以不用寫1處的**,因為當設定濾波時會自動設定,在osx系統中需要顯示設定。

應用乙個濾波到video

core image和core video可以一起工作完成很多效果。以下步驟可以應用乙個濾波到video使用core video在osx上。

1.    使用nsview的子類建立乙個video的view

2.   當你用一幀初始化乙個view時,可以建立乙個cifilter物件並且設定預設值

3.    設定濾波器的輸入引數,除了輸入

4.    每次渲染一幀時,你需要設定輸入並且繪製輸出。你的rendercurrentframe方法如下。為避免篡改,在繪製輸出時,這個例子使用完整的座標系

使用轉換效果

轉換被典型的使用在滑動展示或者在video中從乙個場景切換到另乙個場景。這些效果需要每次渲染,所以需要設定乙個定時器。這一部分的內容主要介紹如何設定乙個定時器。你將學會如何通過設定並應用cicopymachine濾波到兩個靜態的上來做這件事情。轉換濾波需要以下任務:

1.    建立ciimage物件。

2.    設定並安排乙個定時器。

3.    建立乙個cicontext物件

4.    建立乙個cifilter物件。

5.    在osx上,需要為濾波器設定預設值。(ios不需要)

6.    設定濾波器的引數

7.    設定需要處理的源和目標

8.    計算時間

9.    應用濾波

10.  繪製結果

11.  重複8-10,直到轉換完成。

awakefromnib方法,獲得兩個並且把他們設定成源和目的。使用nstimer類,設定每1/30分鐘重複。注意變數thumbnailwidth和thumbnailheight,用來限制渲染到view

設定轉換濾波器

drawrect方法設定乙個與檢視大小相等的矩形。並且設定乙個浮點數作為渲染時間。

函式流程設定inputtime值傳遞給這個方法。它應用轉換,傳遞從轉換到crop 濾波,crop可以保證輸出適合檢視大小。函式返回擷取後的轉換給drawrect函式繪製。

每當時間到時,檢視展示應該被更新

使用CoreImage教程

使用coreimage教程 coreimage包含有很多實用的濾鏡,專業處理的庫,為了能看到各種渲染效果,請使用如下素材.現在可以開始教程了 固定的寬度 uiimage fiximagewidth uiimage image,cgfloat width 片段 將uiimage轉換成ciimage 建...

iOS人臉識別 CoreImage

1 從初始uiimage獲取乙個ciimage物件。2 建立乙個用於分析物件的cicontext。3 通過type和options引數建立乙個cidetector例項。type引數指定了要識別的特徵型別。options引數可以設定識別特徵的精確度,低精確度速度快,高精確度更準確。4 建立乙個影象陣列...

CoreImage框架基本應用

ciimage.這個類儲存影象資料。它可以從uiimage 影象檔案 或者是畫素資料中構造出來。cifilter.濾鏡類包含乙個字典結構,對各種濾鏡定義了屬於他們各自的屬性。濾鏡有很多種,比如鮮豔程度濾鏡,色彩反轉濾鏡,剪裁濾鏡等等。把uiimage轉換成濾鏡可以操作的ciimage ciimage...