iOS / Objective C: conversión de datos RGB a UIImage

Necesito ayuda para convertir una image RAW RGB de 24/32 bits en uiimage.

He probado los ejemplos aquí de Paul Solt y otros, pero nada funciona. ¿Alguien podría mostrar un ejemplo o un tutorial?

Los datos de la image se mantienen en nsdata y me gustaría tener una image jpg o png.

Thx Thorsten

Estoy usando el código de Paul Solt, hace algo, pero la image parece tener cuatro veces la información de la image en una image. No puedo publicar una image aquí: EDIT: agregué las líneas al principio del método entre los comentarios, ahora funciona 🙂

+ (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *) buffer withWidth:(int) width withHeight:(int) height { // added code char* rgba = (char*)malloc(width*height*4); for(int i=0; i < width*height; ++i) { rgba[4*i] = buffer[3*i]; rgba[4*i+1] = buffer[3*i+1]; rgba[4*i+2] = buffer[3*i+2]; rgba[4*i+3] = 255; } // size_t bufferLength = width * height * 4; CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, rgba, bufferLength, NULL); size_t bitsPerComponent = 8; size_t bitsPerPixel = 32; size_t bytesPerRow = 4 * width; CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); if(colorSpaceRef == NULL) { NSLog(@"Error allocating color space"); CGDataProviderRelease(provider); return nil; } CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast; CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; CGImageRef iref = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, // data provider NULL, // decode YES, // should interpolate renderingIntent); uint32_t* pixels = (uint32_t*)malloc(bufferLength); if(pixels == NULL) { NSLog(@"Error: Memory not allocated for bitmap"); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpaceRef); CGImageRelease(iref); return nil; } CGContextRef context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpaceRef, bitmapInfo); if(context == NULL) { NSLog(@"Error context not created"); free(pixels); } UIImage *image = nil; if(context) { CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), iref); CGImageRef imageRef = CGBitmapContextCreateImage(context); // Support both iPad 3.2 and iPhone 4 Retina displays with the correct scale if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) { float scale = [[UIScreen mainScreen] scale]; image = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp]; } else { image = [UIImage imageWithCGImage:imageRef]; } CGImageRelease(imageRef); CGContextRelease(context); } CGColorSpaceRelease(colorSpaceRef); CGImageRelease(iref); CGDataProviderRelease(provider); if(pixels) { free(pixels); } return image; } 

solución:

mis datos de image de bitmap tienen solo 3 bytes, pero ios quiere 4 bytes, el cuarto es para alfa. por lo que insert el siguiente código que agregó un 4º byte solucionó el problema.

 char* rgba = (char*)malloc(width*height*4); for(int i=0; i < width*height; ++i) { rgba[4*i] = buffer[3*i]; rgba[4*i+1] = buffer[3*i+1]; rgba[4*i+2] = buffer[3*i+2]; rgba[4*i+3] = 255; } 

Aquí está la conversión de NSData a UIImage:

 NSData *imageData = UIImagePNGRepresentation(image); UIImage *image=[UIImage imageWithData:data]; 

He creado una image PNG con este código, espero que también funcione para ti.