Why does this GLView screenshot code return a blank / black UIImage?

I use the following code to take a screen shot of pixels in GLView. The problem is that it returns completely black UIImage. This code is called in LineDrawer.m, which is the heart of the code GLView, so it is called from a .m file. How to save the actual screen shot, not black?

- (UIImage*) getGLScreenshot {

NSLog(@"1");

float scale = 0.0;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
{
    // scale value should be 1.0 on 3G and 3GS, and 2.0 on iPhone 4.
    scale = [[UIScreen mainScreen] scale]; 
}

// these are swapped since the screen is rotatey
float h = 768 * scale;
float w = 924 * scale;

NSInteger myDataLength = w * h * 4;

// allocate array and read pixels into it.
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

// gl renders "upside down" so swap top to bottom into new array.
// there gotta be a better way, but this works.
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
for(int y = 0; y <h; y++)
{
    for(int x = 0; x <w * 4; x++)
    {
        buffer2[(((int)h-1) - y) * (int)w * 4 + x] = buffer[y * 4 * (int)w + x];
    }
}

// make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);

// prep the ingredients
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * w;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

// make the cgimage
CGImageRef imageRef = CGImageCreate(w, h, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

// then make the uiimage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
return myImage;

}

- (void)saveGLScreenshotToPhotosAlbum {
UIImageWriteToSavedPhotosAlbum([self getGLScreenshot], nil, nil, nil);
}
+5
source share
2 answers

I needed to do something similar in the Sparrow Framework some time ago, you should be able to get the parts you need from the code in this forum: http://forum.sparrow-framework.org/topic/spdisplayobjectscreenshot

EDIT: http://forum.sparrow-framework.org/topic/taking-screenshots

0

eaglLayer.drawableProperties = [ NSDictionaryWithObjectsAndKeys:

            [NSNumber numberWithBool:YES],  
                kEAGLDrawablePropertyRetainedBacking, 
                kEAGLColorFormatRGB565, 
                kEAGLDrawablePropertyColorFormat, nil];

kEAGLDrawablePropertyRetainedBacking to YES

0

All Articles