iOS開發- OpenGL ES螢幕截圖

來源:互聯網
上載者:User

標籤:detail   ios   his   object   ref   from   nts   use   ast   

之前寫過一個常規的螢幕:http://blog.csdn.net/hitwhylz/article/details/17189351

可是發現這個辦法對於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


iOS開發- OpenGL ES螢幕

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.