Как создать UIImage из текущего графического контекста? - PullRequest
21 голосов
/ 11 июля 2009

Я хотел бы создать объект 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, который представляет графический контекст. Любые предложения о том, как это сделать?

Ответы [ 3 ]

43 голосов
/ 11 июля 2009

Сначала необходимо настроить графический контекст:

UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
7 голосов
/ 11 июля 2009

UIImage * image = UIGraphicsGetImageFromCurrentImageContext ();

Если вам нужно сохранить image, обязательно сохраните его!

EDIT: если вы хотите сохранить вывод drawRect в изображение, просто создайте растровый контекст, используя UIGraphicsBeginImageContext, и вызовите функцию drawRect с новой привязкой контекста. Это проще сделать, чем сохранить CGContextRef, с которым вы работаете, в drawRect - потому что этот контекст может не иметь связанной с ним растровой информации.

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

Вы также можете использовать подход, упомянутый Кельвином. Если вы хотите создать изображение из более сложного вида, такого как UIWebView, его метод быстрее. Рисование слоя вида не требует обновления слоя, оно просто требует перемещения данных изображения из одного буфера в другой!

3 голосов
/ 13 октября 2015

Swift Version

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

        return viewImage
    }
...