Creación / comparación de colors de perfil de laboratorio en iOS

Para una aplicación en la que estoy trabajando, estoy tratando de crear y comparar (distancia entre) colors perfilados de CIE Lab .

Sé que hay maneras de convertir del típico RGB al Lab con algunas matemáticas, pero me gustaría hacerlo de una manera más elegante si es posible.

Creación de colors CIE LAB

Hasta ahora he intentado lo siguiente … (El punto blanco y negro y los numbers de range provienen de aquí )

const CGFloat *components = CGColorGetComponents([UIColor colorWithRed:.11 green:.33 blue:.55 alpha:1.0].CGColor); float whitePoint[3] = {0.95, 1.0, 1.09}; float blackPoint[3] = {0.0,0.0,0.0}; float range[4] = {-127.0,127.0,-127.0,127.0}; CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateLab(whitePoint, blackPoint, range); [self.someArray addObject:[UIColor colorWithCGColor:CGColorCreate(colorSpaceRef, components)]]; 

No estoy seguro de si esta es la forma correcta de crear colors en este espacio, especialmente porque el espacio RGB que utiliza UIColor es más restringido que el Lab en primer lugar. Además, en la conversión de CGColor a UIColor, ¿pierdo mi espacio de color en el process? ( el espacio de color más grande en la image es LAB )

Algo más en lo que pensar es, ¿pueden las pantallas de iDevice mostrar correctamente los colors de Lab (dado que sus píxeles usan RGB)?

Esencialmente lo que estoy buscando es la forma correcta de generar colors aleatorios dentro del espacio Lab.

El espacio de color más grande es CIE Lab

Comparando los colors de CIE LAB

Entonces, una vez que tengo estos colors de laboratorio, ¿cómo puedo get los tres valores ( L , a y b ) para calcular la distancia entre un color y otro? Una vez que haya creado un color y lo haya encapsulado en un UIColor, ¿leerá y comparará los componentes CG de UIColor para mantener la precisión que estoy buscando? (He hecho esto antes en el espacio RGB tomando una distancia euclidiana, y debería ser el mismo concepto aquí, excepto que la distancia tomará en count las diferencias perceptuales humanas , que es lo que estoy esforzándome por hacer).

Si has leído hasta aquí, te lo agradezco y aprecio cualquier contribución que puedas tener o experiencias similares que puedas compartir.

En primer lugar, su image es engañosa. Muestra colors fuera de gama como colors en la gama, muestra diferente luminosidad para diferentes colors y carece de un perfil de color embedded.

En segundo lugar, los dispositivos iOS hasta ahora no han sido calibrados en color. Se usan en muchos ambientes diferentes por lo que la calibración no sería tan útil. Por lo tanto, no puede esperar poder calcular qué color puede percibir un usuario. Los trato como sRGB-displays.

En tercer lugar, todos los colors CIELAB no se pueden convertir a valores RGB válidos, independientemente de los primarios RGB.

Si desea probar de manera uniforme el espacio CIELAB para colors válidos, sugeriría generar líneas L * a * b * y descartar valores no válidos.

 CGFloat r,g,b; while(1) { CGFloat L = random_from_range(0., 100.); CGFloat a = random_from_range(-128., 128.); CGFloat b = random_from_range(-128., 128.); CIELAB_to_sRGB(L,a,b,&r,&g,&b); if ( 0.0 <= r && r <= 1.0 && 0.0 <= g && g <= 1.0 && 0.0 <= b && b <= 1.0 ) { break; } }