【问题标题】:How to use a CGLayer to draw multiple images offscreen如何使用 CGLayer 在屏幕外绘制多个图像
【发布时间】:2009-08-17 12:32:40
【问题描述】:

最终,我正在开发用于 iPhone 的框模糊功能。

该函数将获取 UIImage 并绘制透明副本,首先到侧面,然后获取该图像并在上方和下方绘制透明副本,返回一个很好的模糊图像。

阅读Drawing with Quartz 2D Programming Guide,推荐使用CGLayers进行此类操作。

指南中的示例代码对我来说有点难以理解,所以我希望有人向我展示一个非常简单的示例,即获取 UIImage 并将其转换为 CGLayer 然后我会绘制副本并以 UIImage 的形式返回。

如果值是硬编码的(为简单起见),那就没问题了。这只是为了我的头脑,而不是为了生产代码。

【问题讨论】:

  • @Joe - 如果您有什么要回答的,请回答。这个网站的目的不是为了获得任意分数,而是帮助别人。分数只是积极行为的强化物。仅仅因为有人没有对您的答案投票并不意味着您在写它时浪费了时间。至少,您可能在回答问题的过程中学到了一些东西。
  • @Joe 如果你想帮忙,请帮忙。

标签: iphone core-graphics cglayer


【解决方案1】:
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。

【讨论】:

  • destinationContext 从何而来?我是否只是像这样声明一个新的:CGContextRef destinationContext;
  • 目标上下文是您要在其中绘制图层的上下文。假设您没有自己创建目标上下文,您可以通过调用 UIGraphicsGetCurrentContext 从上下文堆栈中获取它。
  • 当然,如果您打算制作 UIImage 而不是在视图中绘制,您可能会自己制作上下文。您将创建一个位图上下文,在其中绘制,然后使用它的缓冲区创建一个 CGImage,用它来创建一个 UIImage。 (可能有更简单的方法。)
  • 你好@PeterHosey,我有一个从 UIBezeirPath 得到的图像,我想在 CGLayer 上绘制它,我尝试了你的代码,所以当我从屏幕底部画一条线时,它是从左上角到右下角。你能告诉我为什么会发生这种情况
  • @Ranjit:你应该问一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多