2009-08-17 56 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