9

我有一个UIView同时使用UIKitcontrol 和OpenGL. 我想以编程方式获取该视图的屏幕截图。

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

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

4

8 回答 8

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;
     }
于 2012-12-05T12:16:02.837 回答
5

好吧,以编程方式捕获 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 开始,您还可以使用为什么我以编程方式创建的屏幕截图在 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();
    

在这 6 个选项中,我发现第一个选项对于复制粘贴和应用压缩级别非常方便,因为第一种方法可以提供具有真实像素数据的图像。我也喜欢选项 4,因为 API 带有 SDK。

于 2013-07-12T10:17:46.820 回答
5
-(UIImage *) screenshot
{
CGImageRef UIGetScreenImage(void);
CGImageRef screen = UIGetScreenImage();
UIImage* screenImage = [UIImage imageWithCGImage:screen];
CGImageRelease(screen); // you need to call this.
return screenImage;
}
于 2013-09-05T08:27:38.057 回答
2

你得到结果 Uiimage 而不会失去图像质量

    - (UIImage *)captureView:(UIView *)view {
     UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
     [view.layer renderInContext:UIGraphicsGetCurrentContext()];
     UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
     return img;
     }
于 2012-11-08T07:37:45.120 回答
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];
于 2012-11-08T07:45:37.827 回答
0

也许..你能用这里的东西吗

- https://stackoverflow.com/questions/12413460/cocos2d-2-0-screenshots-on-ios-6

和这里...

为什么在 iOS 6.0 中的这段代码中 glReadPixels() 会失败?

于 2012-11-08T14:04:38.513 回答
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);
于 2012-11-08T07:32:54.800 回答
0

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

于 2012-11-08T08:05:38.100 回答