Core Image框架詳細解析(十二) —— 使用反饋處理圖像 Using Feedback to Process Images

版本記錄

版本號 時間
V1.0 2018.01.28

前言

Core Image是IOS5中新加入的一個框架,里面提供了強大高效的圖像處理功能,用來對基于像素的圖像進行操作與分析。還提供了很多強大的濾鏡,可以實現你想要的效果,下面我們就一起解析一下這個框架。感興趣的可以參考上面幾篇。
1. Core Image框架詳細解析(一) —— 基本概覽
2. Core Image框架詳細解析(二) —— Core Image濾波器參考
3. Core Image框架詳細解析(三) —— 關于Core Image
4. Core Image框架詳細解析(四) —— Processing Images處理圖像(一)
5. Core Image框架詳細解析(五) —— Processing Images處理圖像(二)
6. Core Image框架詳細解析(六) —— 圖像中的面部識別Detecting Faces in an Image(一)
7. Core Image框架詳細解析(七) —— 自動增強圖像 Auto Enhancing Images
8. Core Image框架詳細解析(八) —— 查詢系統中的過濾器 Querying the System for Filters
9. Core Image框架詳細解析(九) —— 子類化CIFilter:自定義效果的配方 Subclassing CIFilter: Recipes for Custom Effects(一)
10. Core Image框架詳細解析(十) —— 子類化CIFilter:自定義效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)
11. Core Image框架詳細解析(十一) —— 獲得最佳性能 Getting the Best Performance

使用反饋來處理圖像

CIImageAccumulator類非常適合基于反饋的處理。 顧名思義,它會隨著時間的推移累積圖像數據。 本章介紹如何使用CIImageAccumulator對象來實現一個名為MicroPaint的簡單繪畫應用程序,該應用程序允許用戶在畫布上繪制類似于圖7-1所示的圖像。

Figure 7-1 Output from MicroPaint

“Image”以空白畫布開始。 MicroPaint使用圖像收集器來收集用戶所涂的油漆。 當用戶單擊清除時,MicroPaint會將圖像累加器重置為白色畫布。 顏色也允許用戶改變涂料的顏色。 用戶可以使用滑塊更改畫筆大小。

創建MicroPaint應用程序的圖像累加器的基本任務是:

本章僅介紹創建圖像累加器和支持繪制圖形所必需的代碼。 這里不討論繪制視圖和處理視圖大小變化的方法。 為此,請參閱CIMicroPaint,它是一個完整的示例代碼項目,您可以下載并更詳細地檢查。CIMicroPaint有幾個有趣的細節。 它演示了如何繪制到OpenGL視圖,并保持以前版本的OS X的向后兼容性。


Set Up the Interface for the MicroPaint App - 設置MicroPaint應用程序的界面

MicroPaint的界面需要以下內容:

  • 一個圖像累加器
  • 一個“brush”。 畫筆brush是一個Core Image過濾器(CIRadialGradient),以模擬空氣刷的方式應用顏色。
  • 一個復合過濾器(CISourceOverCompositing),允許新的油漆合成在以前應用的油漆上。
  • 用于跟蹤當前繪畫顏色和筆刷大小的變量。

構建過濾器字典將MircoPaintView聲明為SampleCIView的子類。 SampleCIView類不在這里討論。 它是NSOpenGLView類的一個子類。 有關詳細信息,請參閱CIMicroPaint示例應用程序。

// Listing 7-1  The interface for the MicroPaint app

@interface MicroPaintView : SampleCIView {
    CIImageAccumulator *imageAccumulator;
    CIFilter *brushFilter;
    CIFilter *compositeFilter;
    NSColor *color;
    CGFloat brushSize;
}
@end

Initialize Filters and Default Values for Painting - 初始化繪畫的過濾器和默認值

當初始化MicroPaint應用程序(如Listing 7-2所示)時,您需要創建畫筆和復合濾鏡,并設置初始畫筆大小和繪畫顏色。 Listing 7-2中的代碼被創建并初始化為透明的黑色,輸入半徑為0,當用戶拖動光標時,畫筆過濾器將獲取畫筆大小和顏色的當前值。

// Listing 7-2  Initializing filters, brush size, and paint color

brushFilter = [CIFilter filterWithName: @"CIRadialGradient" withInputParameters:@{
         @"inputColor1": [CIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0],
         @"inputRadius0": @0.0,
         }];
    compositeFilter = [CIFilter filterWithName: @"CISourceOverCompositing"];
    brushSize = 25.0;
    color = [NSClor colorWithDeviceRed: 0.0 green: 0.0 blue : 0.0 alpha : 1.0];

Track and Accumulate Painting Operations - 跟蹤和積累繪畫操作

只要用戶在畫布上單擊或拖動光標,就會調用mouseDragged:方法。 它更新畫筆和合成濾鏡值,并將新的繪畫操作添加到累積的圖像。

設置圖像后,您需要觸發顯示的更新。 drawRect:方法處理繪制圖像。 繪制到CIContext對象時,請確保使用drawImage:inRect:fromRect:而不是棄用的方法drawImage:atPoint:fromRect :

// Listing 7-3  Setting up and applying the brush filter to the accumulated image

- (void)mouseDragged:(NSEvent *)event
{
    CGRect   rect;
    NSPoint  loc = [self convertPoint: [event locationInWindow] fromView: nil];
    CIColor   *cicolor;
 
    // Make a rectangle that is centered on the drag location and
    // whose dimensions are twice of the current brush size
    rect = CGRectMake(loc.x-brushSize, loc.y-brushSize,
                                   2.0*brushSize, 2.0*brushSize);
    // Set the size of the brush
    // Recall this is really a radial gradient filter
    [brushFilter setValue: @(brushSize)
                   forKey: @"inputRadius1"];
    cicolor = [[CIColor alloc] initWithColor: color];
    [brushFilter setValue: cicolor  forKey: @"inputColor0"];
    [brushFilter setValue: [CIVector vectorWithX: loc.x Y:loc.y]
                   forKey: kCIInputCenterKey];
    // Composite the output from the brush filter with the image
    // accummulated by the image accumulator
    [compositeFilter setValue: [brushFilter valueForKey: kCIOutputImageKey]
                       forKey: kCIInputImageKey];
    [compositeFilter setValue: [imageAccumulator image]
                       forKey: kCIInputBackgroundImageKey];
    // Set the image accumluator to the composited image
    [imageAccumulator setImage: [compositeFilter valueForKey: kCIOutputImageKey]
                     dirtyRect: rect];
    // After setting the image, you need to trigger an update of the display
    [self setImage: [imageAccumulator image] dirtyRect: rect];
}

后記

本篇已結束,后面更精彩~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容