1

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

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

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

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

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

谢谢你的时间。

4

2 回答 2

9

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

于 2013-06-05T15:13:33.803 回答
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.

于 2013-06-05T15:32:00.503 回答