Aus*_*tin 5 iphone screenshot objective-c ios5
我想知道是否有人可以提供如何拍摄混合OpenGL和UIKit元素的屏幕截图的示例.自从Apple UIGetScreenImage()私有化以来,这已成为一项相当困难的任务,因为Apple用来取代它的两种常用方法只能捕获UIKit或仅捕获OpenGL.
这个类似的问题引用了Apple的技术问答QA1714,但QA仅描述了如何处理来自相机和UIKit的元素.你如何将UIKit视图层次结构渲染到图像上下文中,然后在其上绘制OpenGL ES视图的图像,就像类似问题的答案所示?
这应该可以解决问题。基本上将所有内容渲染为 CG 并创建一个您可以做任何事情的图像。
// In Your UI View Controller
- (UIImage *)createSavableImage:(UIImage *)plainGLImage
{
UIImageView *glImage = [[UIImageView alloc] initWithImage:[myGlView drawGlToImage]];
glImage.transform = CGAffineTransformMakeScale(1, -1);
UIGraphicsBeginImageContext(self.view.bounds.size);
//order of getting the context depends on what should be rendered first.
// this draws the UIKit on top of the gl image
[glImage.layer renderInContext:UIGraphicsGetCurrentContext()];
[someUIView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Do something with resulting image
return finalImage;
}
// In Your GL View
- (UIImage *)drawGlToImage
{
// Draw OpenGL data to an image context
UIGraphicsBeginImageContext(self.frame.size);
unsigned char buffer[320 * 480 * 4];
CGContextRef aContext = UIGraphicsGetCurrentContext();
glReadPixels(0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, &buffer);
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320 * 480 * 4, NULL);
CGImageRef iref = CGImageCreate(320,480,8,32,320*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, ref, NULL, true, kCGRenderingIntentDefault);
CGContextScaleCTM(aContext, 1.0, -1.0);
CGContextTranslateCTM(aContext, 0, -self.frame.size.height);
UIImage *im = [[UIImage alloc] initWithCGImage:iref];
UIGraphicsEndImageContext();
return im;
}
Run Code Online (Sandbox Code Playgroud)
然后,创建屏幕截图
UIImage *glImage = [self drawGlToImage];
UIImage *screenshot = [self createSavableImage:glImage];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5237 次 |
| 最近记录: |