从CGImage获取RGB像素数据
我正在尝试从CGImage访问像素数据。 我希望能够以整数的forms访问RGB值。 我想我差不多有这个代码:
UIImage* theImage = [UIImage imageNamed:@"rgb.png"]; CGImageRef cgImageRef = CGImageRetain(theImage.CGImage); CFDataRef* imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImageRef)); NSLog(@"the data = %@", imageData);
这然后logging:
数据= <010002fe fffdff02 0200fe04 0003fc>
该图像是一个5×1 png按顺序包含黑色,白色,红色,绿色和蓝色的像素。
我真的不明白我在这里看到什么。 我怎样才能得到一个RGB值的数组,或类似的东西,所以我可以与他们合作。
谢谢,Rich
下面是一些示例代码,它将打印一堆关于图像的相关信息,以及图像像素数据的转储。 它可以处理带有alpha通道的图像,也可以处理不带图像的图像。 该代码甚至可以处理不在RGB色彩空间中的图像,但我怀疑你可能会在iOS上获得这些图像。
将其复制粘贴到您的项目中,并尝试针对一些图像文件运行它,然后也许可以根据您的需要进行调整
-(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"); } }
以下是我尝试过的两个图像的一些示例输出。 他们都是5×3 rgb。 “a.png”图像有一个alpha通道,而“b.rgb”没有。
===== a.png ===== CGImageGetHeight: 5 CGImageGetWidth: 3 CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (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: <CGColorSpace 0x4d08ff0> (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)