Obtención de datos de píxeles RGB desde CGImage

Estoy tratando de acceder a datos de píxeles desde un CGImage. Quiero poder acceder a los valores RGB como enteros. Creo que estoy cerca de este código:

UIImage* theImage = [UIImage imageNamed:@"rgb.png"]; CGImageRef cgImageRef = CGImageRetain(theImage.CGImage); CFDataRef* imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImageRef)); NSLog(@"the data = %@", imageData); 

Esto luego registra:

los datos =

La imagen es un png de 5×1 que contiene un píxel negro, blanco, rojo, verde y azul en ese orden.

Realmente no entiendo lo que estoy viendo aquí. ¿Cómo puedo obtener una matriz de valores RGB o algo similar para poder trabajar con ellos?

Gracias, rico

Aquí hay un código de muestra que imprimirá un montón de información relevante sobre una imagen, así como un volcado de los datos de píxeles de la imagen. Funcionará en imágenes con canales alfa, así como en imágenes sin. El código incluso funcionará en imágenes que no están en el espacio de color RGB, aunque dudo que sea probable que obtenga alguno en iOS.

Copie y pegue en su proyecto e intente ejecutarlo con algunos de sus archivos de imagen, y luego tal vez pueda adaptarlo a sus necesidades.

 -(void)imageDump:(NSString*)file { UIImage* image = [UIImage imageNamed:file]; CGImageRef cgimage = image.CGImage; size_t width = CGImageGetWidth(cgimage); size_t height = CGImageGetHeight(cgimage); size_t bpr = CGImageGetBytesPerRow(cgimage); size_t bpp = CGImageGetBitsPerPixel(cgimage); size_t bpc = CGImageGetBitsPerComponent(cgimage); size_t bytes_per_pixel = bpp / bpc; CGBitmapInfo info = CGImageGetBitmapInfo(cgimage); NSLog( @"\n" "===== %@ =====\n" "CGImageGetHeight: %d\n" "CGImageGetWidth: %d\n" "CGImageGetColorSpace: %@\n" "CGImageGetBitsPerPixel: %d\n" "CGImageGetBitsPerComponent: %d\n" "CGImageGetBytesPerRow: %d\n" "CGImageGetBitmapInfo: 0x%.8X\n" " kCGBitmapAlphaInfoMask = %s\n" " kCGBitmapFloatComponents = %s\n" " kCGBitmapByteOrderMask = 0x%.8X\n" " kCGBitmapByteOrderDefault = %s\n" " kCGBitmapByteOrder16Little = %s\n" " kCGBitmapByteOrder32Little = %s\n" " kCGBitmapByteOrder16Big = %s\n" " kCGBitmapByteOrder32Big = %s\n", file, (int)width, (int)height, CGImageGetColorSpace(cgimage), (int)bpp, (int)bpc, (int)bpr, (unsigned)info, (info & kCGBitmapAlphaInfoMask) ? "YES" : "NO", (info & kCGBitmapFloatComponents) ? "YES" : "NO", (info & kCGBitmapByteOrderMask), ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrderDefault) ? "YES" : "NO", ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder16Little) ? "YES" : "NO", ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Little) ? "YES" : "NO", ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder16Big) ? "YES" : "NO", ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Big) ? "YES" : "NO" ); CGDataProviderRef provider = CGImageGetDataProvider(cgimage); NSData* data = (id)CGDataProviderCopyData(provider); [data autorelease]; const uint8_t* bytes = [data bytes]; printf("Pixel Data:\n"); for(size_t row = 0; row < height; row++) { for(size_t col = 0; col < width; col++) { const uint8_t* pixel = &bytes[row * bpr + col * bytes_per_pixel]; printf("("); for(size_t x = 0; x < bytes_per_pixel; x++) { printf("%.2X", pixel[x]); if( x < bytes_per_pixel - 1 ) printf(","); } printf(")"); if( col < width - 1 ) printf(", "); } printf("\n"); } } 

Aquí hay un ejemplo de salida en dos imágenes que probé. Ambos son 5x3 rgb. La imagen "a.png" tiene un canal alfa, mientras que la "b.rgb" no.

 ===== a.png ===== CGImageGetHeight: 5 CGImageGetWidth: 3 CGImageGetColorSpace:  (kCGColorSpaceDeviceRGB) CGImageGetBitsPerPixel: 32 CGImageGetBitsPerComponent: 8 CGImageGetBytesPerRow: 20 CGImageGetBitmapInfo: 0x00000003 kCGBitmapAlphaInfoMask = YES kCGBitmapFloatComponents = NO kCGBitmapByteOrderMask = NO kCGBitmapByteOrderDefault = NO kCGBitmapByteOrder16Little = NO kCGBitmapByteOrder32Little = NO kCGBitmapByteOrder16Big = NO kCGBitmapByteOrder32Big = NO Pixel Data: (00,00,00,FF), (FF,FF,FF,FF), (FF,00,00,FF), (00,FF,00,FF), (00,00,FF,FF) (00,00,00,FF), (FF,FF,FF,FF), (FF,00,00,FF), (00,FF,00,FF), (00,00,FF,FF) (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00) ===== b.png ===== CGImageGetHeight: 5 CGImageGetWidth: 3 CGImageGetColorSpace:  (kCGColorSpaceDeviceRGB) CGImageGetBitsPerPixel: 24 CGImageGetBitsPerComponent: 8 CGImageGetBytesPerRow: 15 CGImageGetBitmapInfo: 0x00000000 kCGBitmapAlphaInfoMask = NO kCGBitmapFloatComponents = NO kCGBitmapByteOrderMask = NO kCGBitmapByteOrderDefault = NO kCGBitmapByteOrder16Little = NO kCGBitmapByteOrder32Little = NO kCGBitmapByteOrder16Big = NO kCGBitmapByteOrder32Big = NO Pixel Data: (00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) (00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) (00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) 
    Intereting Posts