博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发- OpenGL ES屏幕截图
阅读量:6403 次
发布时间:2019-06-23

本文共 3997 字,大约阅读时间需要 13 分钟。

之前写过一个常规的屏幕截图

可是发现这个办法对于OpenGL 无用。  获取到的数据为空。

所以这里介绍下OpenGL ES屏幕截图。

1.初始化。

CAEAGLLayer *eaglLayer = (CAEAGLLayer *) self.layer;  eaglLayer.drawableProperties = @{      kEAGLDrawablePropertyRetainedBacking: [NSNumber numberWithBool:YES],      kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8  };

2.声明方法。

- (UIImage*)snapshot:(UIView*)eaglview{    GLint backingWidth, backingHeight;        // Bind the color renderbuffer used to render the OpenGL ES view        // If your application only creates a single color renderbuffer which is already bound at this point,        // this call is redundant, but it is needed if you're dealing with multiple renderbuffers.        // Note, replace "viewRenderbuffer" with the actual name of the renderbuffer object defined in your class.        glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);        // Get the size of the backing CAEAGLLayer        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);        NSInteger x = 0, y = 0, width = backingWidth, height = backingHeight;        NSInteger dataLength = width * height * 4;        GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));        // Read pixel data from the framebuffer        glPixelStorei(GL_PACK_ALIGNMENT, 4);        glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);            // Create a CGImage with the pixel data        // If your OpenGL ES content is opaque, use kCGImageAlphaNoneSkipLast to ignore the alpha channel        // otherwise, use kCGImageAlphaPremultipliedLast        CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);        CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();        CGImageRef iref = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast,                                                                        ref, NULL, true, kCGRenderingIntentDefault);            // OpenGL ES measures data in PIXELS        // Create a graphics context with the target size measured in POINTS        NSInteger widthInPoints, heightInPoints;        if (NULL != UIGraphicsBeginImageContextWithOptions) {                // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration                // Set the scale parameter to your OpenGL ES view's contentScaleFactor                // so that you get a high-resolution snapshot when its value is greater than 1.0                CGFloat scale = eaglview.contentScaleFactor;                widthInPoints = width / scale;                heightInPoints = height / scale;                UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthInPoints, heightInPoints), NO, scale);            }        else {                // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext                widthInPoints = width;                heightInPoints = height;                UIGraphicsBeginImageContext(CGSizeMake(widthInPoints, heightInPoints));            }            CGContextRef cgcontext = UIGraphicsGetCurrentContext();            // UIKit coordinate system is upside down to GL/Quartz coordinate system        // Flip the CGImage by rendering it to the flipped bitmap context        // The size of the destination area is measured in POINTS        CGContextSetBlendMode(cgcontext, kCGBlendModeCopy);        CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, widthInPoints, heightInPoints), iref);                // Retrieve the UIImage from the current context        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();                UIGraphicsEndImageContext();        // Clean up        free(data);        CFRelease(ref);        CFRelease(colorspace);        CGImageRelease(iref);        return image;}

3.使用

调用上述的方法就可以。

- (UIImage*)snapshot:(UIView*)eaglview

转载地址:http://mejea.baihongyu.com/

你可能感兴趣的文章
区块链是一个公共数据库,要放在一个块内
查看>>
Jenkins 用户文档(目录)
查看>>
系统常见指标
查看>>
使用crond构建linux定时任务及日志查看
查看>>
地图绘制初探——基于maptalks的2.5D地图绘制
查看>>
SpringBoot2.0之七 实现页面和后台代码的热部署
查看>>
Git 仓库大扫除
查看>>
设计模式-单例模式
查看>>
es6基础0x014:WeakMap
查看>>
九种 “姿势” 让你彻底解决跨域问题
查看>>
php中mysqli 处理查询结果集总结
查看>>
你不知道的JavaScript运算符
查看>>
小程序开发注意事项
查看>>
ECMAScript7规范中的instanceof操作符
查看>>
Hadoop HDFS原理分析
查看>>
【webpack4】基本配置和入门api
查看>>
Mac使用ssh公钥登录Linux
查看>>
【366天】跃迁之路——程序员高效学习方法论探索系列(实验阶段124-2018.02.06)...
查看>>
POJ3070-Fibonacci(矩阵快速幂)
查看>>
[vue插件]基于vue2.x的电商图片放大镜插件
查看>>