如何以编程方式截取iPhone的屏幕截图?

use*_*345 13 iphone cocoa-touch objective-c

在目标C中我们是否可以拍摄屏幕截图并将此图像存储在UIImage中.

Bil*_*son 24

前面的代码假定要捕获的视图存在于主屏幕上......它可能不会.

这是否能够始终捕获主窗口的内容?(警告:在StackOverflow中编译)


- (UIImage *) captureScreen {
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
    CGRect rect = [keyWindow bounds];
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [keyWindow.layer renderInContext:context];   
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用:状态栏未保存,我的一个视图是OpenGL视图,其内容也未保存. (2认同)

Vde*_*edT 17

您需要创建一个屏幕大小的位图上下文并使用

[self.view.layer renderInContext:c]
Run Code Online (Sandbox Code Playgroud)

复制你的视图.完成后,您可以使用

CGBitmapContextCreateImage(c)
Run Code Online (Sandbox Code Playgroud)

从您的上下文创建CGImage.

详细说明:

CGSize screenSize = [[UIScreen mainScreen] applicationFrame].size;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
CGContextRef ctx = CGBitmapContextCreate(nil, screenSize.width, screenSize.height, 8, 4*(int)screenSize.width, colorSpaceRef, kCGImageAlphaPremultipliedLast);
CGContextTranslateCTM(ctx, 0.0, screenSize.height);
CGContextScaleCTM(ctx, 1.0, -1.0);

[(CALayer*)self.view.layer renderInContext:ctx];

CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CGContextRelease(ctx);  
[UIImageJPEGRepresentation(image, 1.0) writeToFile:@"screen.jpg" atomically:NO];
Run Code Online (Sandbox Code Playgroud)

请注意,如果您为响应单击UIButton而运行代码,则图像将显示该按钮被按下.


Bil*_*son 7

UIKit应用程序中的技术问答QA1703屏幕捕获

http://developer.apple.com/iphone/library/qa/qa2010/qa1703.html