如何以编程方式拍摄iPhone的截图?
在目标C中是否可以使用屏幕截图并将其存储在UIImage中。
你需要创build一个你的屏幕大小的位图上下文并使用
[self.view.layer renderInContext:c]
复制你的观点。 一旦完成,你可以使用
CGBitmapContextCreateImage(c)
从你的上下文创build一个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];
请注意,如果您运行代码以响应UIButton的单击,则图像将显示button按下。
前面的代码假定被捕获的视图存在于主屏幕上……它可能不是。
这将工作总是捕获主窗口的内容? (警告:在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; }
技术问答QA1703 UIKit应用程序中的屏幕捕获
http://developer.apple.com/iphone/library/qa/qa2010/qa1703.html
尝试这个…
- (UIImage*)captureView:(UIView *)view { CGRect rect = [[UIScreen mainScreen] bounds]; UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); [view.layer renderInContext:context]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } - (void)saveScreenshotToPhotosAlbum:(UIView *)view { UIImageWriteToSavedPhotosAlbum([self captureView:self.view], nil, nil,nil); }
UIGraphicsBeginImageContext(self.window.bounds.size); [self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData * data = UIImagePNGRepresentation(image); [data writeToFile:@"foo.png" atomically:YES];
更新2011年4月:对于视网膜显示,将第一行更改为:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale); } else { UIGraphicsBeginImageContext(self.window.bounds.size); }
// 100%的工作
- (UIImage *)screenshot { UIGraphicsBeginImageContextWithOptions(self.main_uiview.bounds.size, NO, 2.0f); [self.main_uiview drawViewHierarchyInRect:_main_uiview.bounds afterScreenUpdates:YES]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }
是的,这是一个链接到苹果开发者论坛https://devforums.apple.com/message/149553
使用此代码截取屏幕截图:
-(void)webViewDidFinishLoad:(UIWebView *)webView { UIGraphicsBeginImageContext(self.webView.bounds.size); [self.webView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(screenshotImage, nil, nil, nil); NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *str1=[NSString stringWithFormat:@"%d",myInt]; NSString *pngFilePath = [NSString stringWithFormat:@"%@/page_%@.png",docDir,str1]; // any name u want for image NSLog(@"%@",pngFilePath); NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(screenshotImage)]; [data1 writeToFile:pngFilePath atomically:YES]; }
- (void)SnapShot { if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); } else { UIGraphicsBeginImageContext(self.view.bounds.size); } [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData *data = UIImagePNGRepresentation(image); [data writeToFile:@"snapshot.png" options:NSDataWritingWithoutOverwriting error:Nil]; [data writeToFile:@"snapshot.png" atomically:YES]; UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:data], nil, nil, nil); }