Подтвердить что ты не робот

Как создать UIImage из текущего графического контекста?

Я хотел бы создать объект 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 и заполняется каждый раз, когда затрагиваетсяEnded: вызывается. Также обратите внимание, что drawRect: может вызываться несколько раз, как пользователь рисует.

Когда пользователь будет выполнен, я хотел бы создать объект UIImage, который представляет графический контекст. Любые предложения о том, как это сделать?

4b9b3361

Ответ 1

Сначала нужно настроить графический контекст:

UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Ответ 2

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

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

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

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

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

Ответ 3

Быстрая версия

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

        return viewImage
    }