Estoy cargando this (very small) image usando:Cómo determinar e interpretar el formato de píxel de un CGImage
UIImage* image = [UIImage named:@"someFile.png"];
La imagen es de 4x1 y contiene un píxel rojo, verde, azul y blanco de izquierda a derecha, en ese orden
A continuación, obtener los datos de los píxeles de la CGImage subyacente:
NSData* data = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
Ahora, por alguna razón, los datos de píxeles se presenta de manera diferente dependiendo del dispositivo iOS.
Cuando ejecuto la aplicación en el simulador o en mi iPhone 4, los datos de píxeles se ve así:
(255,0,0), (0,255,0), (0,0,255), (255,255,255)
Por lo tanto, los píxeles son 3 bytes por píxel, con el azul como el byte más significativo y el rojo como el menos significativo. ¿Entonces supongo que llamas BGR?
Cuando verifico CGBitmapInfo, puedo ver que kCGBitmapByteOrderMask es kCGBitmapByteOrderDefault. No puedo encontrar ningún lugar que explique qué es "predeterminado".
Por otro lado, cuando lo ejecuto en mi primera generación de iPhone, los datos de píxeles se parece a esto:
(0,0,255,255), (0,255,0,255), (255,0,0,255), (255,255,255,255)
Así que 4 bytes por canal, alfa como el byte más significativo y azul como el menos significativo. Entonces ... ¿eso se llama ARGB?
He estado mirando CGBitmapInfo en busca de pistas sobre cómo detectar el diseño. En el iPhone de primera generación, el kCGBitmapAlphaInfoMask es kCGImageAlphaNoneSkipFirst. Eso significa que los bits más significativos son ignorados. Entonces eso tiene sentido. En el iPhone de primera generación, el kCGBitmapByteOrderMask es kCGBitmapByteOrder32Little. No sé lo que eso significa ni cómo relacionarlo con la forma en que los componentes R, G y B se presentan en la memoria. ¿Alguien puede arrojar algo de luz sobre esto?
Gracias.
Esto está marcado como la respuesta aceptada, pero en realidad no responde la pregunta. También parece un poco como martillar un clavo con un martillo. ¿Por qué volver a dibujar una imagen completa usando todo ese código cuando todo lo que uno realmente quiere hacer es ordenar el orden de bytes de los datos existentes? –
Victor, ¿lo ha averiguado por casualidad, es decir, cómo lidiar con kCGBitmapByteOrderDefault? –