2009-07-11 4 views
21

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

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

+0

Оба из ответов ниже работы. Обратите внимание, что между ними существует функциональная разница, которая заключается в том, что рендеринг слоя в контексте изображения также отображает фон слоя; call drawRect: прямо нет (в моем случае это не имеет значения). Я перехожу к подходу CALayer renderInContext из-за сложности с вызовом drawRect: напрямую (подробнее см. Http://lists.apple.com/archives/Cocoa-dev/2002/Apr/msg01846.html). Благодаря! – figelwump

ответ

42

Вам нужно настроить графический контекст: первый

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

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

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

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

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

+0

Спасибо за ответ, однако, похоже, не работает. Я добавил строку: \t _signatureImage = UIGraphicsGetImageFromCurrentImageContext(); ... где _signatureImage является сохраненным свойством. Возвращаемый объект равен нулю. Согласно документам, UIGraphicsGetImageFromCurrentImageContext() предназначен для использования, только если текущий контекст является контекстом растрового изображения. В моей текущей реализации drawRect: я не верю, что это так. В документах упоминается использование UIGraphicsBeginImageContext(), но я не уверен, как это применимо в моем случае, поскольку drawRect может вызываться несколько раз. – figelwump

2

Swift Версия

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

     return viewImage 
    }