2012-06-23 2 views
5

Sto utilizzando il seguente codice per acquisire uno screenshot dei pixel in un GLView. Il problema è che restituisce un UIImage completamente nero. Questo codice viene chiamato in LineDrawer.m, che è il cuore del codice GLView, quindi viene chiamato dal file .m corretto. Come posso salvare lo screenshot effettivo e non un'immagine nera?Perché questo codice di schermata GLView restituisce una UII immagine vuota/nera?

- (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's 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); 
} 
+1

È necessario liberare le due buffer e rilasciare il 'provider',' colorSpaceRef', e 'imageRef'. Inoltre puoi probabilmente fare il capovolgimento verticale fornendo da qualche parte un valore 'stride 'negativo. – jhabbott

+0

Come posso fare questo? Ci dispiace, ma non ho molta esperienza con OpenGL e questa è una libreria drop-in! Apprezzerei molto un esempio :-) –

+0

Il mio commento non è una risposta alla tua domanda, sto segnalando le tue perdite di memoria. Dovresti leggere il conteggio dei riferimenti in CoreFoundation e Objective-C in generale. Inoltre è necessario essere consapevoli della gestione della memoria in C quando si usa malloc. – jhabbott

risposta

0

cambiare la vostra proprietà disegnabili

eaglLayer.drawableProperties = [dictionaryWithObjectsAndKeys NSDictionary:

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

kEAGLDrawablePropertyRetainedBacking YES