21

我想从当前图形上下文创建一个 UIImage 对象。更具体地说,我的用例是用户可以在上面画线的视图。他们可能会逐渐绘制。完成后,我想创建一个 UIImage 来表示他们的绘图。

这是 drawRect: 现在对我来说的样子:

- (void)drawRect:(CGRect)rect
{
CGContextRef c = UIGraphicsGetCurrentContext();

CGContextSaveGState(c);
CGContextSetStrokeColorWithColor(c, [UIColor blackColor].CGColor);
CGContextSetLineWidth(c,1.5f);

for(CFIndex i = 0; i < CFArrayGetCount(_pathArray); i++)
{
    CGPathRef path = CFArrayGetValueAtIndex(_pathArray, i);
    CGContextAddPath(c, path);
}

CGContextStrokePath(c);

CGContextRestoreGState(c);
}

... 其中 _pathArray 是 CFArrayRef 类型,每次调用 touchesEnded: 时都会填充。另请注意,在用户绘制时,drawRect: 可能会被多次调用。

用户完成后,我想创建一个表示图形上下文的 UIImage 对象。关于如何做到这一点的任何建议?

4

3 回答 3

43

您需要先设置图形上下文:

UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2009-07-11T07:13:39.817 回答
7

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

如果您需要保留image,请务必保留它!

编辑:如果要将 drawRect 的输出保存到图像,只需使用创建位图上下文UIGraphicsBeginImageContext并使用新的上下文绑定调用 drawRect 函数。这比在 drawRect 中保存您正在使用的 CGContextRef 更容易 - 因为该上下文可能没有与之关联的位图信息。

UIGraphicsBeginImageContext(view.bounds.size);
[view drawRect: [myView bounds]];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

您也可以使用 Kelvin 提到的方法。如果你想从像 UIWebView 这样更复杂的视图中创建图像,他的方法更快。绘制视图的图层不需要刷新图层,它只需要将图像数据从一个缓冲区移动到另一个缓冲区!

于 2009-07-11T04:46:37.757 回答
3

斯威夫特版本

    func createImage(from view: UIView) -> UIImage {
        UIGraphicsBeginImageContext(view.bounds.size)
        view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let viewImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return viewImage
    }
于 2015-10-13T14:17:57.637 回答