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 ).