2009-08-17 21 views
2

最終,我正在研究iPhone上使用的框模糊功能。如何使用CGLayer在屏幕外畫多個圖像

該函數將採取UIImage並繪製透明副本,首先到兩側,然後拍攝該圖像並在上下繪製透明副本,返回一個很好模糊的圖像。

讀取Drawing with Quartz 2D Programming Guide,它建議使用CGLayers進行這種操作。

指南中的示例代碼是有點晦澀難懂,我聽不懂,所以我希望有人給我取一個的UIImage並將其轉換爲一個CGLayer,我會再畫一個很簡單的例子副本並作爲UIImage返回。

如果數值是硬編碼的(爲了簡單起見),這將是確定的。這僅僅是爲了包裝我的頭,而不是生產代碼。

+0

@Joe - 如果您有要回答的問題,請做。這個網站的重點不是爲了獲得任意點,而是爲了幫助他人。這個分數僅僅是積極行爲的強化。僅僅因爲有人沒有對你的答案進行投票並不意味着你浪費了時間來編寫答案。至少,你可能在回答問題的過程中學到了一些東西。 – 2011-01-05 15:45:06

+0

@Joe如果你想幫忙,請幫忙。 – willc2 2011-01-08 19:27:31

回答

2
UIImage *myImage = …; 
CGLayerRef layer = CGLayerCreateWithContext(destinationContext, myImage.size, /*auxiliaryInfo*/ NULL); 
if (layer) { 
    CGContextRef layerContext = CGLayerGetContext(layer); 
    CGContextDrawImage(layerContext, (CGRect){ CGPointZero, myImage.size }, myImage.CGImage); 

    //Use CGContextDrawLayerAtPoint or CGContextDrawLayerInRect as many times as necessary. Whichever function you choose, be sure to pass destinationContext to it—you can't draw the layer into itself! 

    CFRelease(layer); 
} 

這在技術上是我的第一個iPhone代碼(我只在Mac上編程),所以要小心。儘管如此,我曾經使用過CGLayer,並且據我所知,Quartz在iPhone上並沒有什麼不同。

...並作爲UIImage返回。

我不知道如何做到這一點,從未與UIKit合作過。

+0

destinationContext從哪裏來?我只需要聲明一個像這樣的新的:CGContextRef destinationContext; – willc2 2009-08-18 13:53:34

+0

目標上下文是您要將圖層繪製到的目標上下文。假設你不是自己創建目的地上下文,你可以通過調用'UIGraphicsGetCurrentContext'從上下文棧中得到它。 – 2009-08-18 14:59:30

+0

當然,如果您打算製作UIImage而不是在視圖中繪製,您可能會自己創建上下文。你需要創建一個位圖上下文,然後使用它的緩衝區創建一個CGImage來創建一個UIImage。 (可能有更簡單的方法) – 2009-08-18 16:03:03