无论iOS 7(Jailbroken)中哪个应用程序位于最前端,如何为整个屏幕截取屏幕截图

时间:2014-02-07 13:49:12

标签: ios objective-c iphone-privateapi cydia tweak

在iOS7之前,我使用UIGetScreenImage()函数轻松截取屏幕截图,但在iOS7中,它已被弃用,现在有什么好方法可以存档吗?谢谢!

另外:我需要在任何视图中截取整个屏幕的截图

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,但没有想法如何解决它。

我尝试IOSurface - IOS Private API - Capture screenshot in background,这在某些应用中运行良好但在游戏中返回黑屏。

然后我尝试了这个应用程序https://github.com/k06a/UIView-FastScreenshot/blob/master/UIView%2BFastScreenshot.m,它使用私有api很好,但是我无法使用theos编译它,总是告诉我“架构armv7的未定义符号:CARenderServerRenderDisplay”。 编辑:我想出了如何使用theos编译它,但返回是空图像。

另外,https://github.com/coolstar/RecordMyScreen在iOS7中运行良好,但现在不是开源的,所以我无法知道它是如何捕获整个屏幕的。

编辑:RecordMyScreen的代码在iOS7上作为跳板调整,你可以参考这个文件https://github.com/coolstar/RecordMyScreen/blob/master/RecordMyScreen/CSScreenRecorder.m这个方法“ - (void)_captureShot:(CMTime)frameTime;”

答案 1 :(得分:1)

替换UIGetScreenImage()的替代方法

CGImageRef screen = UIGetScreenImage();

上面的代码是捕获屏幕的一行代码,但Apple没有为公共应用程序打开上面的API UIGetScreenImage()。即无法上传到Apple批准。因此,捕获屏幕并保存它的另一种方法如下所示。

- (void)captureAndSaveImage
{    

    // Capture screen here... and cut the appropriate size for saving and uploading
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // crop the area you want 
    CGRect rect;
    rect = CGRectMake(0, 10, 300, 300);    // whatever you want
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage *img = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef);
    UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    imageView.image = img; // show cropped image on the ImageView     
}

// this is option to alert the image saving status
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    UIAlertView *alert;

    // Unable to save the image  
    if (error)
        alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                                           message:@"Unable to save image to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Dismiss" 
                                 otherButtonTitles:nil];
    else // All is well
        alert = [[UIAlertView alloc] initWithTitle:@"Success" 
                                           message:@"Image saved to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Ok" 
                                 otherButtonTitles:nil];
    [alert show];
    [alert release];
}

部分链接可以帮助您how-to-legally-replace-uigetscreenimage

答案 2 :(得分:1)

UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

此代码可以帮助您获取 self.view 的屏幕截图,无论哪个应用程序位于前面,它都是iPhone的整个屏幕。如果您在视图中使用了任何图层,然后图层将不会包含在屏幕截图中,为此您必须使用 self.view.layer

答案 3 :(得分:0)

UIView类有一个名为:resizableSnapshotViewFromRect的方法:afterScreenUpdates:withCapInsets。

但我从未使用过这种方法,所以我无法告诉你更多关于它的信息。

这篇文章:Capture UIView as UIImage展示了如何将返回的UIView转换为图像。

希望它有用。