i am using this function to create Screenshots of the Stage in my IPAD App:
- (UIImage *)getImageScreenshot{ int WIDTH = 1024; int HEIGHT = 768; CGSize size = CGSizeMake(WIDTH,HEIGHT); //Create un buffer for pixels GLuint bufferLenght=size.width*size.height*4; GLubyte *buffer = (GLubyte *) malloc(bufferLenght); //Read Pixels from OpenGL glReadPixels(0,0,size.width,size.height,GL_RGBA,GL_UNSIGNED_BYTE,buffer); //Make data provider with data. CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, bufferLenght, NULL); //Configure image int bitsPerComponent = 8; int bitsPerPixel = 32; int bytesPerRow = 4 * size.width; CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; CGImageRef iref = CGImageCreate(size.width,size.height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent); uint32_t *pixels = (uint32_t *)malloc(bufferLenght); CGContextRef context = CGBitmapContextCreate(pixels, WIDTH, HEIGHT, 8, WIDTH*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextTranslateCTM(context,0, size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawImage(context, CGRectMake(0.0, 0.0, size.width, size.height), iref); UIImage* screenshot = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)]; UIGraphicsEndImageContext(); //free memory CGColorSpaceRelease(colorSpaceRef); CGDataProviderRelease(provider); CGImageRelease(iref); CGContextRelease(context); free(buffer); free(pixels); return screenshot; }
The function is declared in a category which extends SPDisplayobject
@interface SPDisplayObject (ScreenshotFromSPDisplayObject)
I use it like this from an UIViewController with an SPStage in an SPView:
// attach screenshot tempImage = [self.stage getImageScreenshot]; screenShot = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,1024,768)]; screenShot.image = tempImage; [self.view addSubview:screenShot]; // the dealloc of the UIViewController - (void)dealloc { [screenShot removeFromSuperview]; [screenShot release]; [super dealloc]; }
Taking Screenshots works like a charm, but with every Screenshot my App is growing around 10 MBs So i can do this around 15 Times till the app crashes.
Any ideas where to free any memory?
Thank you for any help with this.
Wolfgang