我想拍摄窗口的屏幕截图,并将该图像用作新视图控制器的背景视图。我的问题是,该图像是视网膜显示中的模糊,因为图像应该 640X1136 。但以下代码返回的图片大小仅为 320X568 。
注意:如果我使用Apple的私有API UIGetScreenImage()
,则会返回大小 640X1136 的图片。
-(UIImage*)getScreenShot:(CALayer*)layer
{
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0.0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
[self getScreenShot:self.window.layer];
有没有办法让屏幕截图大小 640X1136 而不使用苹果公司的私有API?
答案 0 :(得分:2)
-(UIImage*)getScreenShot:(CALayer*)layer
{
CGFloat scale = 1.0;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
scale = [[UIScreen mainScreen] scale];
}
#endif
UIGraphicsBeginImageContextWithOptions(CGSizeMake(layer.frame.size.width*scale, layer.frame.size.height*scale), NO, 0.0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
答案 1 :(得分:1)
如果您使用的是iOS 7,则可以使用专为拍摄屏幕截图设计的新方法drawViewHierarchyInRect:afterScreenUpdates:
(请查看此文档链接,了解有关BOOL
参数的信息renderInContext:
1}}方法)。
如果不是,您可以使用旧方法UIGraphicsBeginImageContextWithOptions
。如果您仅定位到iOS 7,则可以删除以下drawViewHierarchyInRect:afterScreenUpdates:
声明。
if
UIVIew *window = [UIApplication sharedApplication].delegate.window;
CGRect rect = window.bounds;
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
[window drawViewHierarchyInRect:rect afterScreenUpdates:NO];
} else {
[window.layer renderInContext:UIGraphicsGetCurrentContext()];
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// image now contains a screen shot
参数确保屏幕截图的分辨率正确,将scale
传递给size
表示它将使用0
值。 [UIScreen mainScreen].scale
可能会将其scale
报告为非视网膜,但其size
将正确为UIImage
,此值用于计算像素图像根据文档的大小:
如果将图像的逻辑大小(存储在{{3}}属性中)乘以此属性中的值,则可以获得图像的尺寸(以像素为单位)。
答案 2 :(得分:0)
试试这个,
UIGraphicsBeginImageContext(self.bounds.size);
或
UIGraphicsBeginImageContext(CGSizeMake(640X1136));