2009-07-11 35 views
21

Tôi muốn tạo đối tượng UIImage từ ngữ cảnh đồ họa hiện tại. Cụ thể hơn, trường hợp sử dụng của tôi là chế độ xem mà người dùng có thể vẽ đường. Họ có thể rút dần. Sau khi hoàn thành, tôi muốn tạo một UIImage để đại diện cho bản vẽ của họ.Cách tạo UIImage từ ngữ cảnh đồ họa hiện tại?

Đây là những gì drawRect: trông giống như đối với tôi bây giờ:

- (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); 
} 

... nơi _pathArray là loại CFArrayRef, và được phổ biến mỗi khi touchesEnded: được gọi. Cũng lưu ý rằng drawRect: có thể được gọi nhiều lần, khi người dùng vẽ.

Khi người dùng hoàn tất, tôi muốn tạo đối tượng UIImage đại diện cho ngữ cảnh đồ họa. Có bất cứ đề nghị nào cho việc làm như thế này hả?

+0

Cả hai câu trả lời dưới đây làm việc. Lưu ý rằng có một sự khác biệt về chức năng giữa hai yếu tố, đó là việc hiển thị lớp trong ngữ cảnh hình ảnh cũng sẽ hiển thị nền của lớp; gọi drawRect: trực tiếp không (trong trường hợp của tôi nó không quan trọng). Tôi sẽ sử dụng phương thức renderInContext của CALayer vì sự phức tạp với drawRect gọi: trực tiếp (Xem http://lists.apple.com/archives/Cocoa-dev/2002/Apr/msg01846.html để biết chi tiết). Cảm ơn! – figelwump

Trả lời

42

Bạn cần phải thiết lập bối cảnh đồ họa đầu tiên:

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

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

Nếu bạn cần giữ image xung quanh, hãy chắc chắn giữ nguyên!

EDIT: Nếu bạn muốn lưu đầu ra của drawRect vào một hình ảnh, chỉ cần tạo một ngữ cảnh bitmap bằng cách sử dụng UIGraphicsBeginImageContext và gọi hàm drawRect của bạn với ngữ cảnh mới bị ràng buộc. Sẽ dễ dàng hơn khi lưu CGContextRef mà bạn đang làm việc với drawRect - vì ngữ cảnh đó có thể không có thông tin bitmap liên kết với nó.

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

Bạn cũng có thể sử dụng cách tiếp cận mà Kelvin đã đề cập. Nếu bạn muốn tạo một hình ảnh từ một khung nhìn phức tạp hơn như UIWebView, phương thức của anh ta nhanh hơn. Vẽ lớp của khung nhìn không yêu cầu làm mới lớp, nó chỉ yêu cầu di chuyển dữ liệu hình ảnh từ bộ đệm này sang bộ đệm khác!

+0

Cảm ơn bạn đã phản hồi, tuy nhiên dường như không hoạt động. Tôi đã thêm dòng: \t _signatureImage = UIGraphicsGetImageFromCurrentImageContext(); ... trong đó _signatureImage là thuộc tính được giữ lại. Đối tượng trả về là nil. Theo các tài liệu, UIGraphicsGetImageFromCurrentImageContext() chỉ được sử dụng nếu ngữ cảnh hiện tại là một ngữ cảnh bitmap. Trong thực hiện hiện tại của tôi drawRect: Tôi không tin đó là trường hợp. Các tài liệu đề cập đến việc sử dụng UIGraphicsBeginImageContext(), nhưng tôi không chắc chắn cách áp dụng trong trường hợp của tôi vì drawRect có thể được gọi nhiều lần. – figelwump

2

Swift Version

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

     return viewImage 
    } 
Các vấn đề liên quan