2010-07-14 38 views
9

Tôi cần lấy nội dung của NSView và đặt chúng vào một NSImage, cho một dự án thử nghiệm. Điều này có thể không? Tôi đã làm một số Googling, đã thử hai phương pháp mà tôi tìm thấy - nhưng họ đã không thực sự làm việc. Bất kỳ đề xuất?Làm cách nào để chụp "ảnh chụp màn hình" của NSView?

+4

Những phương pháp didn 't làm việc và tại sao? –

Trả lời

19
[[NSImage alloc] initWithData:[view dataWithPDFInsideRect:[view bounds]]]; 
+0

Cảm ơn bạn rất nhiều. – Debashis

+2

+1 Cần lưu ý rằng, mặc dù đây là một cách đúng đắn nói chung, có một số trường hợp nó sẽ không hoạt động, ví dụ như các khung nhìn như 'NSOpenGLView' có ngữ cảnh dựng hình OpenGL của riêng chúng. Trong trường hợp đó, bạn cần lấy dữ liệu pixel trực tiếp và tạo một đại diện bitmap từ nó, điều này ít gọn gàng hơn một chút. – walkytalky

+0

Obs: shadows và cornerRadius sẽ bị bỏ qua – codrut

6
let dataOfView = view.dataWithPDFInsideRect(view.bounds) 
let imageOfView = NSImage(data: dataOfView) 
11

Từ WWDC 2012 phiên 245 (dịch sang Swift):

let viewToCapture = self.window!.contentView! 
let rep = viewToCapture.bitmapImageRepForCachingDisplayInRect(viewToCapture.bounds)! 
viewToCapture.cacheDisplayInRect(viewToCapture.bounds, toBitmapImageRep: rep) 

let img = NSImage(size: viewToCapture.bounds.size) 
img.addRepresentation(rep) 
+0

swift 3 let rep = viewToCapture.bitmapImageRepForCachingDisplay (in: viewToCapture.bounds)! viewToCapture.cacheDisplay (in: viewToCapture.bounds, to: rep) let img = NSImage (kích thước: viewToCapture.bounds.size) img.addĐại diện (rep) – spacecash21

+0

Lưu ý: không phải lúc nào cũng hoạt động chính xác. Tôi đang phát hành một nhãn có hệ tọa độ xoay. – Ash

+0

Đây là giải pháp tốt nhất cho tôi, không giống như phiên bản pdf, điều này cũng chiếm các vùng tối và góc tròn. Không giống như phiên bản nắp cửa sổ, điều này chỉ chụp chế độ xem hiện tại. Mã Obj C: '- (NSImage *) screenCap { \t NSBitmapImageRep * bitmap = [self bitmapImageRepForCachingDisplayInRect: self.bounds]; \t [self cacheDisplayInRect: self.bounds toBitmapImageRep: bitmap]; \t Kết quả NSImage * = [[Phân bổ NSImage] initWithSize: self.bounds.size]; \t [kết quả bổ sungĐại diện: bitmap]; \t kết quả trả về; } ' – codrut

Các vấn đề liên quan