Getting RGB pixel data from CGImage Getting RGB pixel data from CGImage ios ios

Getting RGB pixel data from CGImage


Here's some sample code that will print a bunch of relevant info about an image, as well as a dump of the image's pixel data. It will work on images with alpha channels, as well as images without. The code will even work on images that are not in the RGB color space, though I doubt you'd be likely to get any of those on iOS.

Copy-paste it into your project and try to run it against a few of your image files, and then perhaps you can adapt it to your needs

-(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");    }}

Here's some sample output on two images I tried. They're both 5x3 rgb. The "a.png" image has an alpha channel, while the "b.rgb" does not.

===== a.png =====CGImageGetHeight: 5CGImageGetWidth:  3CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (kCGColorSpaceDeviceRGB)CGImageGetBitsPerPixel:     32CGImageGetBitsPerComponent: 8CGImageGetBytesPerRow:      20CGImageGetBitmapInfo: 0x00000003  kCGBitmapAlphaInfoMask     = YES  kCGBitmapFloatComponents   = NO  kCGBitmapByteOrderMask     = NO  kCGBitmapByteOrderDefault  = NO  kCGBitmapByteOrder16Little = NO  kCGBitmapByteOrder32Little = NO  kCGBitmapByteOrder16Big    = NO  kCGBitmapByteOrder32Big    = NOPixel 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: 5CGImageGetWidth:  3CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (kCGColorSpaceDeviceRGB)CGImageGetBitsPerPixel:     24CGImageGetBitsPerComponent: 8CGImageGetBytesPerRow:      15CGImageGetBitmapInfo: 0x00000000  kCGBitmapAlphaInfoMask     = NO  kCGBitmapFloatComponents   = NO  kCGBitmapByteOrderMask     = NO  kCGBitmapByteOrderDefault  = NO  kCGBitmapByteOrder16Little = NO  kCGBitmapByteOrder32Little = NO  kCGBitmapByteOrder16Big    = NO  kCGBitmapByteOrder32Big    = NOPixel 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)