2013-06-05 39 views
1

我正在开发一个应用程序,我需要从一个线程截图。我无法做到这一点使用下面的代码:如何使用NSThread截取UIView的截图?

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

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

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

如果有人要纪念这个问题的重复,那么请给我提供一个适当的链接,也应采取请关心这个,我问在线程中创建图像。

谢谢你的时间。

回答

9

与其他所有答案不同,你要相信:这是不可能的。 UIKit不是线程安全的,所以做任何事情,即使只是将UI渲染成位图,也不能保证工作。你必须在恐惧的主线上这样做。

+0

是的,这是我现在面临的所有场景,但没有办法,我可以创建任何UIView的UIImage?现在我尝试了NSThread和NsOperation并使用 - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg方法。但是对于他们所有人来说,我都会遇到网络锁定错误,并且我的应用程序崩溃了。 –

+0

@Jack_iPhone不,不可能,不管你如何将代码卸载到另一个线程。截取屏幕截图的位必须在主线程上完成。 – JustSid

+0

根据Apple文档,必须在主线程上调用所有UIKit方法。请注意,'UIGraphicsGetImageFromCurrentImageContext'(以及您调用的所有其他方法)都以'UI'开头,因此是UIKit方法! – lnafziger

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); 

注意我没有使用了阿尔法所以kCGImageAlphaNoneSkipFirst,但你可能会想这么用kCGImageAlphaFirst