iphone - Obteniendo datos de píxeles RGB de CGImage
ios (1)
Estoy tratando de acceder a los datos de píxeles de un CGImage. Quiero poder acceder a los valores RGB como enteros. Creo que casi estoy ahí con este código:
UIImage* theImage = [UIImage imageNamed:@"rgb.png"];
CGImageRef cgImageRef = CGImageRetain(theImage.CGImage);
CFDataRef* imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImageRef));
NSLog(@"the data = %@", imageData);
Esto entonces registra:
los datos = <010002fe fffdff02 0200fe04 0003fc>
La imagen es un png 5x1 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 serie de valores RGB o algo similar para poder trabajar con ellos?
Gracias rico
Aquí hay un código de ejemplo 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 puedas obtener alguno de ellos en iOS.
Copie y pegue en su proyecto e intente ejecutarlo en 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 algunos resultados de muestra en dos imágenes que probé. Ambos son 5x3 rgb. La imagen "a.png" tiene un canal alfa, mientras que la "b.rgb" no la tiene.
===== 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)