我有UIView
同时使用UIKit
控件和OpenGL
。我想以编程方式获得该视图的屏幕截图。
如果我使用UIGraphicsGetImageFromCurrentImageContext()
,则OpenGL
内容为空;
如果我使用glReadPixels(...)
方法,则UIKit内容为空;
我对如何拍摄完整的屏幕截图感到困惑。 谢谢!
答案 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屏幕的方法很少
使用UIKIT http://developer.apple.com/library/ios/#qa/qa1703/_index.html
使用AVFoundation框架http://developer.apple.com/library/ios/#qa/qa1702/_index.html
使用OpenGL ES http://developer.apple.com/library/ios/#qa/qa1704/_index.html
从iOS 7开始,您还可以使用Why does my programmatically created screenshot look so bad on iOS 7?
使用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();
使用UIView
UIGraphicsBeginImageContext(self.view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
在这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)