2012-11-08 35 views
8

Tôi có một số UIView sử dụng cả điều khiển UIKitOpenGL. Tôi muốn có một ảnh chụp màn hình của chế độ xem đó theo chương trình.Làm cách nào để chụp ảnh màn hình lập trình trong iOS?

Nếu tôi sử dụng UIGraphicsGetImageFromCurrentImageContext(), nội dung OpenGL để trống; Nếu tôi sử dụng phương pháp glReadPixels(...), nội dung UIKit trống;

Tôi nhầm lẫn về cách chụp ảnh màn hình hoàn chỉnh. Cảm ơn bạn!

Trả lời

0

Dưới đây là cách bạn có thể chụp một ảnh chụp màn hình đơn giản theo chương trình của UIImage. Nếu bạn muốn nó cho bất kỳ đối tượng khác thay thế UIImage với nó.

Trong tập tin .h thêm NSData *Data; sau đó trong tập tin .m bạn thêm video này vào mã của bạn

UIGraphicsBeginImageContext(self.view.frame.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *attachimage = [[UIImage alloc]initWithData:Data]; 
UIImage *viImage=UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
attachimage = viImage; 
UIImageWriteToSavedPhotosAlbum(viImage, nil, nil, nil); 
+0

nó chỉ mất tác dụng trong tình trạng UIKit đối với trang OpenGL, chỉ nhận được hình ảnh trống – coodi8

2

Bạn được kết quả UIImage mà không chất lượng mất hình ảnh

- (UIImage *)captureView:(UIView *)view { 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
    } 
+0

nó không có hiệu lực thi trong một trang OpenGL – coodi8

+0

là bạn sử dụng GLGridview? – kb920

+0

không, chỉ xem OpenGL phổ biến – coodi8

1
UIGraphicsBeginImageContext(self.view.bounds.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData *data = [UIImagePNGRepresentation(image) retain]; 
UImage *screenShot = [UIImage imageWithData:data]; 
+0

nó chỉ có hiệu ứng trong điều kiện UIKit, đối với trang OpenGL, chỉ có được hình ảnh trống – coodi8

0

Bạn biết nơi Nội dung OpenGL nằm trong chế độ xem của bạn. Vì vậy, sẽ dễ dàng sao chép kết quả của glReadPixels vào ảnh chụp nhanh của UIKit.

+0

Tôi đang phát triển một điều khiển ảnh chụp màn hình, tôi không biết liệu khung nhìn có được thực hiện bởi UIKit hay OpenGL hay không . Nếu tôi có thể nhận được thông tin rằng khung nhìn được thực hiện bởi cái gì, vấn đề sẽ được giải quyết. – coodi8

+0

@ coodi8 Tôi nghĩ rằng điều này có thể là một vấn đề. Sẽ không dễ dàng bởi vì OpenGL hiển thị trực tiếp trên chip đồ họa. UI-Graphics không được hiển thị trên chip đồ họa. (AFAIK) –

8

sử dụng đoạn mã sau để có màn bắn

-(UIImage *) screenshot 
    { 

      CGRect rect; 
      rect=CGRectMake(0, 0, 320, 480); 
      UIGraphicsBeginImageContext(rect.size); 

      CGContextRef context=UIGraphicsGetCurrentContext(); 
      [self.view.layer renderInContext:context]; 

      UIImage *image=UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      return image; 
    } 
+0

Mã này chỉ dành cho công cụ UIKit ... Câu hỏi phức tạp hơn và được giải thích rõ ràng: anh ấy cũng cần phải có những thứ OpenGL. –

4

Vâng, có rất ít cách để thu thập iPho màn hình ne lập trình

  1. Sử dụng UIKit http://developer.apple.com/library/ios/#qa/qa1703/_index.html

  2. Sử dụng AVFoundation khuôn khổ http://developer.apple.com/library/ios/#qa/qa1702/_index.html

  3. Sử dụng OpenGL ES http://developer.apple.com/library/ios/#qa/qa1704/_index.html

  4. Bắt đầu từ iOS 7 bạn cũng có thể sử dụng Why does my programmatically created screenshot look so bad on iOS 7?

  5. Sử dụng UIWindow

    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    UIGraphicsBeginImageContext(screenRect.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [[UIColor blackColor] set]; 
    CGContextFillRect(ctx, screenRect); 
    [self.window.layer renderInContext:ctx]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    
  6. Sử dụng UIView

    UIGraphicsBeginImageContext(self.view.frame.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viImage=UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    

Out of những 6 lựa chọn, tôi thấy các tùy chọn đầu tiên rất thuận tiện cho việc sao chép dán và áp dụng mức độ nén như phương pháp 1 cho hình ảnh với dữ liệu pixel thực. Tôi cũng thích tùy chọn 4, vì API đi kèm với SDK.

+1

Cảm ơn điều này, có vẻ như màn hình với bộ điều khiển phụ xem không tự động thêm lớp điều khiển xem con. Nhưng việc sử dụng cửa sổ dường như hoạt động với hình ảnh toàn màn hình. Cảm ơn! – slycrel

5
-(UIImage *) screenshot 
{ 
CGImageRef UIGetScreenImage(void); 
CGImageRef screen = UIGetScreenImage(); 
UIImage* screenImage = [UIImage imageWithCGImage:screen]; 
CGImageRelease(screen); // you need to call this. 
return screenImage; 
} 
+0

Ai đó có thể giải thích nó hoạt động như thế nào? Cũng cần phải sửa định hướng – ZYiOS

+0

chắc chắn không phải là cách để đi [đây là lý do] (http://stackoverflow.com/questions/3767860/uigetscreenimage-the-app-is-not-getting-the-approval-due-to -phương pháp này) –

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