Core Image編程指南翻譯八(使用反饋處理圖像)

示例代碼

CIImageAccumulator類非常適合基于反饋的處理打月。顧名思義澡匪,它隨著時(shí)間的推移累積圖像數(shù)據(jù)缝左。本章介紹如何使用CIImageAccumulator對(duì)象實(shí)現(xiàn)一個(gè)名為MicroPaint的簡(jiǎn)單繪畫應(yīng)用程序温自,該應(yīng)用程序允許用戶在畫布上繪制以創(chuàng)建類似于圖7-1所示的圖像已维。

圖7-1 MicroPaint的輸出


image

“圖像”以空白畫布開始淆攻。MicroPaint使用圖像累加器來收集用戶應(yīng)用的繪制阔墩。當(dāng)用戶單擊“清除”時(shí),MicroPaint會(huì)將圖像累加器重置為白色畫布瓶珊。顏色井允許用戶改變油漆顏色啸箫。用戶可以使用滑塊更改畫筆大小。

為MicroPaint應(yīng)用程序創(chuàng)建圖像累加器的基本任務(wù)是:

  • 設(shè)置MicroPaint應(yīng)用程序的界面
  • 初始化繪畫的過濾器和默認(rèn)值
  • 跟蹤和積累繪畫操作

本章僅介紹創(chuàng)建圖像累加器和支持圖形累加器所必需的代碼伞芹。此處不討論繪制到視圖和處理視圖大小更改的方法忘苛。為此,請(qǐng)參閱CIMicroPaint唱较,這是一個(gè)完整的示例代碼項(xiàng)目扎唾,您可以下載并更詳細(xì)地查看。CIMicroPaint有幾個(gè)有趣的細(xì)節(jié)南缓。它展示了如何繪制到OpenGL視圖并保持以前版本的OS X的向后兼容性胸遇。

設(shè)置MicroPaint應(yīng)用程序的界面

MicroPaint的界面需要以下內(nèi)容:

  • 圖像累加器
  • 用戶的“刷子”。筆刷是核心圖像濾鏡(CIRadialGradient)汉形,它以模擬氣刷的方式應(yīng)用顏色纸镊。
  • 復(fù)合濾鏡(CISourceOverCompositing),允許新涂料與先前應(yīng)用的涂料合成概疆。
  • 用于跟蹤當(dāng)前油漆顏色和刷子尺寸的變量逗威。

構(gòu)建過濾器字典聲明MircoPaintView為SampleCIView的子類。這個(gè)SampleCIView課不在這里討論; 它NSOpenGLView是類的子類届案。有關(guān)詳細(xì)信息庵楷,請(qǐng)參閱CIMicroPaint示例應(yīng)用程序

清單7-1 MicroPaint應(yīng)用程序的界面

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

初始化繪畫的濾鏡和默認(rèn)值

初始化MicroPaint應(yīng)用程序時(shí)(如清單7-2所示)楣颠,您需要?jiǎng)?chuàng)建畫筆和復(fù)合濾鏡,并設(shè)置初始畫筆大小和繪畫顏色咐蚯。清單7-2中的代碼已創(chuàng)建并初始化為透明黑色童漩,輸入半徑為0.當(dāng)用戶拖動(dòng)光標(biāo)時(shí),畫筆過濾器將采用畫筆大小和顏色的當(dāng)前值春锋。

清單7-2 初始化過濾器矫膨,畫筆大小和繪畫顏色

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 = [NSColor colorWithDeviceRed: 0.0 green: 0.0 blue: 0.0 alpha: 1.0];

跟蹤和積累繪畫操作

mouseDragged:只要用戶單擊或拖動(dòng)畫布上的光標(biāo),就會(huì)調(diào)用該方法。它會(huì)更新畫筆和合成濾鏡值侧馅,并為累積的圖像添加新的繪畫操作危尿。

設(shè)置圖像后,需要觸發(fā)顯示更新馁痴。您的drawRect:方法處理繪制圖像谊娇。繪制到CIContext對(duì)象時(shí),請(qǐng)確保使用drawImage:inRect:fromRect:而不是棄用的方法drawImage:atPoint:fromRect:罗晕。

清單7-3 設(shè)置刷子過濾器并將其應(yīng)用于累積圖像

- (void)mouseDragged:(NSEvent *)event
{
    CGRect   rect;
    NSPoint  loc = [self convertPoint: [event locationInWindow] fromView: nil];
    CIColor   *cicolor;
 
    //創(chuàng)建一個(gè)以拖動(dòng)位置為中心的矩形
    //其尺寸是當(dāng)前畫筆大小的兩倍
    rect = CGRectMake(loc.x-brushSize, loc.y-brushSize,
                                   2.0*brushSize, 2.0*brushSize);
    //設(shè)置畫筆的大小
    //回想一下济欢,這實(shí)際上是一個(gè)徑向漸變?yōu)V鏡
    [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];
    //將畫筆濾鏡的輸出與圖像合成
    //由圖像累加器累加
    [compositeFilter setValue: [brushFilter valueForKey: kCIOutputImageKey]
                       forKey: kCIInputImageKey];
    [compositeFilter setValue: [imageAccumulator image]
                       forKey: kCIInputBackgroundImageKey];
    //將圖像累加器設(shè)置為合成圖像
    [imageAccumulator setImage: [compositeFilter valueForKey: kCIOutputImageKey]
                     dirtyRect: rect];
    //設(shè)置圖像后,需要觸發(fā)顯示更新
    [self setImage: [imageAccumulator image] dirtyRect: rect];
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末小渊,一起剝皮案震驚了整個(gè)濱河市法褥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酬屉,老刑警劉巖半等,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呐萨,居然都是意外死亡酱鸭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門垛吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凹髓,“玉大人,你說我怎么就攤上這事怯屉∥狄ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵锨络,是天一觀的道長(zhǎng)赌躺。 經(jīng)常有香客問我,道長(zhǎng)羡儿,這世上最難降的妖魔是什么礼患? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮掠归,結(jié)果婚禮上缅叠,老公的妹妹穿的比我還像新娘。我一直安慰自己虏冻,他們只是感情好肤粱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厨相,像睡著了一般领曼。 火紅的嫁衣襯著肌膚如雪鸥鹉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天庶骄,我揣著相機(jī)與錄音毁渗,去河邊找鬼。 笑死单刁,一個(gè)胖子當(dāng)著我的面吹牛灸异,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幻碱,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绎狭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了褥傍?” 一聲冷哼從身側(cè)響起儡嘶,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恍风,沒想到半個(gè)月后蹦狂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朋贬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年凯楔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锦募。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摆屯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糠亩,到底是詐尸還是另有隱情虐骑,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布赎线,位于F島的核電站廷没,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏垂寥。R本人自食惡果不足惜颠黎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滞项。 院中可真熱鬧狭归,春花似錦、人聲如沸蓖扑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽律杠。三九已至潭流,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柜去,已是汗流浹背灰嫉。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗓奢,地道東北人讼撒。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像股耽,于是被迫代替她去往敵國(guó)和親根盒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容