2013-02-15 77 views
19

我有一個在前臺和透明背景黃色花瓶的圖像:認沽邊框部分透明的圖片被繪製在CGContext上

enter image description here

我畫它在CGContext上:

CGContextDrawImage(context, CGRectMake(0, 0, 100, 100), myImage.CGImage); 

我可以CGContextDrawImage之前使用下面的語句周圍畫一個陰影:

CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor); 

enter image description here

但我想提出一個衝程的圖像周圍,這樣它會看起來如下:

enter image description here

如果我這樣做:

CGContextSetRGBStrokeColor(shadowContext, 0.0f, 0.0f, 1.0f, 1.0f); 
CGContextSetLineWidth(shadowContext, 5); 
CGContextStrokeRect(shadowContext, CGRectMake(0, 0, 100, 100)); 

它(顯然)在整個圖像周圍繪製矩形邊框,如下所示:

enter image description here

這不是我所需要的。

但是,在第三個圖像中繪製邊框的最佳方法是什麼?

請注意,在這種情況下不可能使用UIImageView,因此使用UIImageView的CALayer的屬性不適用。

+0

在調用CGContextDrawImage之前調用'CGContextSetShadowWithColor'嗎? – Ariel 2013-02-20 01:22:03

+0

@elcanibal:是的。否則,不會有影子。我正在編輯原始問題以反映這一點。 – 2013-02-20 14:50:41

+0

請張貼透明背景的黃色花瓶的PNG。您的第一張(未修改過的)圖像背景爲灰色。 – 2013-02-20 20:49:53

回答

13

這樣做的一種方法是使用mathematical morphology operator of dilation向外「生長」圖像的alpha通道,然後使用生成的灰度圖像作爲蒙版來模擬筆畫。通過填充擴大的面具,然後在主要的圖像上繪製,你會得到中風的效果。我已經在Github上創建了一個展示這種效果的演示:https://github.com/warrenm/Morphology(所有源代碼都是麻省理工學院許可的,如果它證明對您有用)。

這裏是它在行動截圖:

enter image description here

注意,這是驚人的慢(擴張需要一個內核在每一個像素的迭代),那麼你應該選擇一個筆劃的寬度和預先計算提前爲每個源圖像屏蔽圖像。

+1

我不知道將它移植到核心映像內核語言是否可行。這種實現可能比具有C標量操作的直接循環快得多。 – 2013-02-21 19:49:57

+0

對於一些有CI或甚至GLSL經驗的人來說,這將是非常微不足道的。它只是一個鄰域內的最小化算子。不過,我的理解是,Core Image在iOS上不可插入。另外,如果一個人聰明,可以利用內核的可分性或可分解性來做更少的工作。 – warrenm 2013-02-21 19:56:42

+0

當你說得對。我之前沒有注意到:CIKernel在iOS中不存在(從iOS文檔缺席)。 – 2013-02-21 19:58:39

0

我會嘗試在調用CGContextDrawImage之前設置筆觸顏色和線寬,或者調整陰影(不透明度,模糊等),使其看起來像圖像周圍的筆觸。讓我知道這個是否奏效!

+0

這是行不通的。兩個原因:1.陰影不能準確模擬中風。 2。我需要把中風和陰影。所以我需要能夠真正描繪圖像。 – 2013-02-20 22:41:20

+0

您可以在調用'CGContextDrawImage'之前設置這兩項,即事先調用'CGContextSetShadowWithColor','CGContextSetRGBStrokeColor'和'CGContextSetLineWidth'。 – Ariel 2013-02-20 22:51:16

+1

@elcanibal:但你是什麼中風?你需要一條路徑。 – 2013-02-21 01:09:09