如何使用NSThread获取UIView的屏幕截图?

时间:2013-06-05 13:44:26

标签: ios uiview nsthread

我正在开发一款应用,我需要从一个帖子中截取屏幕截图。我无法使用以下代码执行此操作:

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, [[UIScreen mainScreen] scale]);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

如果有人要将这个问题标记为重复,那么请提供一个正确的链接来回答并请关注此问题我也在询问如何在线程中创建图像。

感谢您的时间。

2 个答案:

答案 0 :(得分:9)

与所有其他答案不同,你想要相信:这是不可能的。 UIKit不是线程安全的,所以做任何事情,甚至只是将UI呈现为位图,都不能保证工作。你必须在我担心的主线程上这样做。

答案 1 :(得分:0)

我不能给你一个在线程中严格执行此操作的方法,但可以让你接近。

确定视图的大小(以像素为单位)(即视网膜或非视网膜),然后使用CGBitmapContextCreate创建位图上下文,在线程上分配内存并将其全部设置。你想在iOS上使用BGRA(我记得),但要确认一下(使用正确的布局会导致更快的绘图)。

现在您已拥有上下文,将块发布到主线程并绘制到上下文中。

renderInContext:完成后,回发到后台队列(或线程),将此位图转换为CGImageRef,然后就可以获得UIImage。

编辑:这是从我使用AVFoundation的一些代码中获取的 - 我认为这是你想要的但是再次尝试确认(很难找到关于选项的绝对参考义):

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // same as CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRef newContext = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little);

注意我没有使用alpha kCGImageAlphaNoneSkipFirst,但您可能需要它,所以请使用kCGImageAlphaFirst