如何在iOS中以编程方式截取屏幕截图?

时间:2012-11-08 07:28:24

标签: iphone ios opengl-es uikit screenshot

我有UIView同时使用UIKit控件和OpenGL。我想以编程方式获得该视图的屏幕截图。

如果我使用UIGraphicsGetImageFromCurrentImageContext(),则OpenGL内容为空; 如果我使用glReadPixels(...)方法,则UIKit内容为空;

我对如何拍摄完整的屏幕截图感到困惑。 谢谢!

8 个答案:

答案 0 :(得分:8)

使用以下代码进行截屏

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

嗯,以编程方式捕捉iPhone屏幕的方法很少

  1. 使用UIKIT http://developer.apple.com/library/ios/#qa/qa1703/_index.html

  2. 使用AVFoundation框架http://developer.apple.com/library/ios/#qa/qa1702/_index.html

  3. 使用OpenGL ES http://developer.apple.com/library/ios/#qa/qa1704/_index.html

  4. 从iOS 7开始,您还可以使用Why does my programmatically created screenshot look so bad on iOS 7?

  5. 使用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. 使用UIView

    UIGraphicsBeginImageContext(self.view.frame.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viImage=UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
  7. 在这6个选项中,我发现第一个选项非常方便用于复制粘贴和应用压缩级别,因为1st方法为图像提供了真实的像素数据。我也喜欢选项4,因为API附带了SDK。

答案 3 :(得分:2)

您可以获得结果Uiimage而不会丢失图像质量

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

答案 4 :(得分: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];

答案 5 :(得分:0)

以下是如何以编程方式对UIImage进行简单截屏。如果您希望它替换任何其他对象,请将UIImage替换为它。

.h文件中添加NSData *Data;,然后在.m文件中将此添加到您的代码中

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

答案 6 :(得分:0)

您知道OpenGL内容在视图中的位置。因此,将glReadPixels的结果复制到UIKit的快照中应该很容易。

答案 7 :(得分:0)