iphone ios uiview opengl-es eaglview

iphone - EAGLView a UIImage problema de conversión de color



ios uiview (1)

Para cualquiera que todavía le importe, vea mi comentario a continuación:

Tommy, finalmente me metí en una solución. Era otro problema de tiempo de EAGLView (que solo apareció durante la saturación en realidad), y pude solucionarlo con su método performSelector: afterDelay: 0.0. Gracias

Además, recomendaría a cualquiera que codifique iOS 5.0 que mire en Core Image y GLKView. Básicamente, hacen su trabajo de ajuste de propiedades de imagen (como lo estoy haciendo aquí) y EAGLView a UIImage tipo de conversión de cosas mucho más simples.

Tengo un EAGLView (tomado de ejemplos de Apple) que puedo convertir con éxito a un UIImage usando este código:

- (UIImage *)glToUIImage:(CGSize)size { NSInteger backingWidth = size.width; NSInteger backingHeight = size.height; NSInteger myDataLength = backingWidth * backingHeight * 4; // allocate array and read pixels into it. GLuint *buffer = (GLuint *) malloc(myDataLength); glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer); // gl renders “upside down” so swap top to bottom into new array. for(int y = 0; y < backingHeight / 2; y++) { for(int x = 0; x < backingWidth; x++) { //Swap top and bottom bytes GLuint top = buffer[y * backingWidth + x]; GLuint bottom = buffer[(backingHeight - 1 - y) * backingWidth + x]; buffer[(backingHeight - 1 - y) * backingWidth + x] = top; buffer[y * backingWidth + x] = bottom; } } // make data provider with data. CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releaseScreenshotData); // prep the ingredients const int bitsPerComponent = 8; const int bitsPerPixel = 4 * bitsPerComponent; const int bytesPerRow = 4 * backingWidth; CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; // make the cgimage CGImageRef imageRef = CGImageCreate(backingWidth, backingHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, YES, renderingIntent); CGColorSpaceRelease(colorSpaceRef); CGDataProviderRelease(provider); // then make the UIImage from that UIImage *myImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); return myImage; } void releaseScreenshotData(void *info, const void *data, size_t size) { free((void *)data); };

Y aquí está el código donde uso este método para convertir a un UIImage:

EAGLView *newView = [[EAGLView alloc] initWithImage:photo.originalImage]; [newView reshapeFramebuffer]; [newView drawView:theSlider.tag value:theSlider.value]; //the two lines above are how EAGLViews in Apple''s examples are modified photoItem *newPhoto = [[photoItem alloc] initWithImage:[self glToUIImage:photo.originalImage.size]];

El problema que tengo es que, a veces, el UIImage convertido no tendrá los mismos colores que el EAGLView. Esto ocurre si aplico una alta saturación al EAGLView, o alto brigtness, o bajo contraste, y en algunos otros casos. Por ejemplo, si aplico una saturación alta al EAGLView y luego lo convierto a UIImage, algunas partes de la imagen serán más brillantes de lo que se supone que debe ser.

Así que descubrí que el problema era un problema de temporización de EAGLView disfrazado, similar a mi pregunta anterior aquí ( EAGLView a UIImage timing question ).