update: 2012/01/31
reference: Core Image Programming Guide: Core Image Concepts
Core Image 概念之二
D. 處理過程路徑
1. 圖 1-5 顯示在二個原始影像上操作濾鏡的像素處理過程路徑. 原始影像通常
都被指定為
你可以利用以下的方式來轉成
未加工(raw)的影像資料(使用
(CGContextRef), 一個 OpenGL 的紋理(texture), 或是一個 Core Video 的影像
緩衝器(CVImageBufferRef).
注意, 實際的影像輸入數量, 與是否濾鏡需要一個輸入的影像依不同的濾鏡而異,
濾鏡是非常有彈性的, 可以做到以下的事情:
a. 不需要影像而運作. 有些濾鏡基於輸入非影像的參數來產生影像. (例如, 在
Core Image Filter Reference 中, 查看
b. 需要一個影像. (例如, 在 Core Image Filter Reference 中, 查看
c. 需要二個或多個影像. 用來合成影像的濾鏡或使用一個影像中的值來控制並
處理另一個影像中的像素, 這都是典型地需要二個或多個影像. 其中一個輸入
的影像能夠作為遮光影像(shading image), 影像遮罩, 背景影像或提供控制
處理其它影像外觀時的查詢值之來源. (例如, 在 Core Image Filter Reference
中, 查看
當要處理一個影像時, 你有責任去建立一個包含適當輸入資料的
注意: 雖然
才會描繪出影像. 這個延遲求值(lazy evaluation)的方法(查看
"Filter Clients and Filter Creators" ) 允許 Core Image 盡可能地高效率運作.
2. 每個原始影像的像素會被
(sampler).
kernel. 濾鏡創造者要為每個原始影像提供
取樣器的任何事情.
一個取樣器定義了以下的事情:
a. 協調的轉換(coordinate transform): 如果沒有需要轉換的話, 可以是本身的轉換.
b. 竄改模式(interpolation mode): 可以是最鄰近的樣本或是雙線性的(bilinear)
竄改(此為預設).
c. 包裹模式(wrapping mode): 當樣本區域位在原始影像之外時, 明確說明如何產生
像素 ---- 使用透明黑(transparent black)或限制到其範圍(clamp to the extent).
濾鏡創造者在 kernel 中定義每個像素的影像處理計算, 但是 Core Image 處理那些
計算的實際實作. Core Image 決定使用 GPU 或 CPU 來執行計算. Core Image 經由
OpenGL 來實作硬體光柵化處理(rasterization: 由向量圖形轉換為光柵圖形的過程).
它經由特別調整用來為片斷(fragment)求值程序的模擬環境中實作了軟體的光柵化
處理, 其隨著非投射性(nonprojective)紋理(texture)來查詢大的四邊形
(quadrilaterals or quads).
3. 雖然像素處理的路徑是從原始影像到目的地, 但是 Core Image 所使用的計算路徑都被指定為
CIImage 物件.
Core Image 提供了多樣的方式來取得影像資料. 你可以利用以下的方式來轉成
CIImage 物件: 提供一個連結到影像的 URL, 讀取
未加工(raw)的影像資料(使用
NSData 類別
), 轉換一個 Quartz 2D 影像(CGContextRef), 一個 OpenGL 的紋理(texture), 或是一個 Core Video 的影像
緩衝器(CVImageBufferRef).
注意, 實際的影像輸入數量, 與是否濾鏡需要一個輸入的影像依不同的濾鏡而異,
濾鏡是非常有彈性的, 可以做到以下的事情:
a. 不需要影像而運作. 有些濾鏡基於輸入非影像的參數來產生影像. (例如, 在
Core Image Filter Reference 中, 查看
CICheckerboardGenerator 與
CIConstantColorGenerator 濾鏡.
)b. 需要一個影像. (例如, 在 Core Image Filter Reference 中, 查看
CIColorPosterize
與
CICMYKHalftone
濾鏡.
)c. 需要二個或多個影像. 用來合成影像的濾鏡或使用一個影像中的值來控制並
處理另一個影像中的像素, 這都是典型地需要二個或多個影像. 其中一個輸入
的影像能夠作為遮光影像(shading image), 影像遮罩, 背景影像或提供控制
處理其它影像外觀時的查詢值之來源. (例如, 在 Core Image Filter Reference
中, 查看
CIShadedMaterial
濾鏡.
)當要處理一個影像時, 你有責任去建立一個包含適當輸入資料的
CIImage 物件.
注意: 雖然
CIImage 物件
是與影像資料相關聯的, 它本身並不是影像. 你可以將CIImage 物件看成是一個影像的配方(
recipe). 一個
CIImage 物件擁有產生
一個影像
所需要的所有資訊, 但是 Core Image 實際上直到被告知去作時,才會描繪出影像. 這個延遲求值(lazy evaluation)的方法(查看
"Filter Clients and Filter Creators" ) 允許 Core Image 盡可能地高效率運作.
2. 每個原始影像的像素會被
CISampler 物件所取走(
fetched), 或只是一個
取樣器(sampler).
就如其名稱所
建議的, 取樣器會取回影像的樣本並且將它們提供給 kernel. 濾鏡創造者要為每個原始影像提供
取樣器. 濾鏡委託人不需要知道有關
取樣器的任何事情.
一個取樣器定義了以下的事情:
a. 協調的轉換(coordinate transform): 如果沒有需要轉換的話, 可以是本身的轉換.
b. 竄改模式(interpolation mode): 可以是最鄰近的樣本或是雙線性的(bilinear)
竄改(此為預設).
c. 包裹模式(wrapping mode): 當樣本區域位在原始影像之外時, 明確說明如何產生
像素 ---- 使用透明黑(transparent black)或限制到其範圍(clamp to the extent).
濾鏡創造者在 kernel 中定義每個像素的影像處理計算, 但是 Core Image 處理那些
計算的實際實作. Core Image 決定使用 GPU 或 CPU 來執行計算. Core Image 經由
OpenGL 來實作硬體光柵化處理(rasterization: 由向量圖形轉換為光柵圖形的過程).
它經由特別調整用來為片斷(fragment)求值程序的模擬環境中實作了軟體的光柵化
處理, 其隨著非投射性(nonprojective)紋理(texture)來查詢大的四邊形
(quadrilaterals or quads).
從目的地開始, 並且它的工作方式是反向回到原始像素的, 如圖 1-6 所示.
所使用的像素數量. 提供選擇的東西(二擇一), Core Image 沒有使用的是處理
所有原始像素的暴力(brute force)方法, 接著之後決定目的地需要什麼東西.
近一點來看圖 1-6.
4. 假定在圖 1-6 中的濾鏡執行某些種類的合成操作, 例如 source-over 合成
(上面的圖形覆蓋了下面的圖形).
濾鏡委託人
想要將二個影像作部分重疊, 所以只有每個影像的一小部份會合成以達到結果, 如圖的左邊所示. 更進一步來看,
目的地應該會是什麼樣子? Core Image 能夠決定從哪個原始影像來的資料會對
最後的影像(目的地)發生作用, 並且只限制在那些原始影像中作計算. 結果, 取樣器
只會在原始影像遮蔽的地區取回樣本, 如圖 1-6 所示.
5. 注意, 在圖中標記為 domain of definition 的箱子(box). 這個定義的範圍是將來
要限制住計算的方式. 它是一個在所有像素都透明之外的地區(那就是 alpha 成分
等於零). 在這個例子中, 定義的範圍跟目的影像正確地相符. Core Image 提供了一個
CIFilterShape 物件用來定義這個
區域. CIFilterShape 類別提供
了一些方法可以用來: 定義矩形的形狀, 轉換形狀, 以及在多邊形上執行嵌入(inset), 聯集(union),
與交集 (intersection)的操作. 例如, 假如你使用一個小於遮蔽地區的矩形定義一個
濾鏡的外形, 如圖 1-6 所示, Core Image 就會使用該資訊作為未來在計算中限制
所使用的原始像素.
6. Core Image 用其它的方式來提升高效率的處理. 它執行聰明的快取與編譯器最佳化,
以致能適合如即時錄影控制的任務. 它對任何評估為多次出現的資料集, 快取了中間
的結果(intermediate results). 每當增加一個新的影像會造成快取成長太大時,
Core Image 以最近最少使用(least-recently-used)的次序來收回資料. 這意謂著:
當那些被使用一次經過一段時間之後, 有需要時可能會被移入或移出快取, 而繼續
存在快取中的物件會頻繁地重復被使用. 你的應用程式得益於 Core Image 的快取,
而無須知道快取是如何實作的細節. 然而無論什麼時候, 你卻可以藉由重復使用物件
(影像, contexts, 等等)來獲得最佳的效能.
7. Core Image 藉由在 kernel 及 pass levels 中使用傳統的編輯(compilation)技術,
也可以獲得重大的效能. Core Image 採用的方法是: 配置最小化的註冊, 包括
暫時註冊的數目(每個 kernel), 與暫時的像素緩衝器(每個濾鏡的圖). 編譯器執行
CSE(Common Subexpression: 共同子運算式)並且作監視點最佳化
(peephole optimization), 在讀取資料相依的紋理時自動識別, 這些是基於之前
的計算, 並且它們不是資料相依的. 又一次, 你自己無需擔心編輯(compilation)
技術的細節. 重點為 Core Image 是懂硬體的; 每當可行的話, 它會使用 GPU 的
力量, 並且採用敏捷的方式.
© 2004, 2011 Apple Inc. All Rights Reserved. (Last updated: 2011-10-12)