perfil - Manera adecuada de convertir CGColors entre espacios de color
srgb android (3)
Apple agregó esta API en iOS 9 y macOS 10.11:
- ObjC:
CGColorCreateCopyByMatchingToColorSpace
- Swift:
CGColor.converted(to:intent:options:)
Hay varias preguntas que hacen sobre la conversión de colores entre espacios de color en plataformas Apple. Desafortunadamente, las respuestas a menudo involucran NSColor
o UIColor
- UIColor
no portátiles de Objective-C que no se pueden usar indistintamente en OS X e iOS.
Así que me gustaría preguntar algo muy específico que estoy seguro de que debe haber una buena respuesta. Simplemente no puedo creer que Apple no previera la necesidad de esto.
¿Cómo se puede convertir CGColor
de un espacio de color (por ejemplo, monocromo) a otro (por ejemplo, RGB) de una manera genérica, admitiendo todos los tipos de CGColorSpace
, mientras se usan únicamente las funciones portátiles de Core Graphics?
Algún contexto. Necesito multiplicar el valor proporcionado por un servicio en línea con un valor almacenado en UIColor
. La forma correcta de extraer los componentes RGB antes de iOS5, que finalmente introdujo el método -[UIColor getRed:green:blue:alpha:]
, es usar CGColorGetComponents()
. Luego multiplico este color con el color obtenido del servicio en línea. Esto falla en caso de que se haya utilizado +[UIColor grayColor]
para generar el UIColor
. Es decir, necesito convertir el color del espacio de color en escala de grises a RGB. En este caso, es fácil. ¿Qué pasa con algún otro espacio de color que se proporciona? ¿O qué pasa si en un futuro escenario teórico solo quiero procesar el color de un solo píxel?
Hay una sugerencia en alguna parte de que pinte un píxel en un contexto de mapa de bits y luego lea este píxel. Eso es una locura, y espero que no sea la única manera de hacer esto. Obviamente, el método de dibujo puede averiguar cómo realizar la conversión; ¿Cómo podemos aprovechar esto sin crear un contexto de mapa de bits únicamente para dibujar un píxel en él?
Investigación adicional:
- Este artículo sobre la conversión de color, además del
UIColor
indocumentado / privado de estilo de-styleString
, también menciona de manera más interesante lasCGColorTransform
s noCGColorTransform
. - ColorCG.cpp de WebKit sugiere que hay un encabezado llamado
CoreGraphics/CGColorTransform.h
. Desafortunadamente, este encabezado no existe, al menos no en Mountain Lion. ¿Por qué Apple escondería estas APIs? - El único otro recurso sensible que encontré al mencionar
CGColorTransform
s es FreeQuartz, una reimplementación gratuita / de código abierto de Core Graphics.
Archivó un radar con Apple, # 12141580, para abrir y documentar CGColorTransform
. Sin embargo, no estoy conteniendo la respiración, así que si hay otras sugerencias sensatas, soy todo oídos.
La pregunta dice explícitamente que quieren evitar dibujar en un contexto de mapa de bits creado únicamente con el propósito de convertir colores, pero no me di cuenta y se me ocurrió esto.
Dejaré esto como referencia para cualquier persona que pueda tropezar con esta pregunta y quiera saber cómo realizaría la transformación dibujando en un mapa de bits temporal.
CGColorRef source;
CGColorSpaceRef targetColorSpace;
int components = CGColorSpaceGetNumberOfComponents(targetColorSpace);
CGFloat temp-buffer[components];
CGContextRef temp-bmp = CGBitmapContextCreate(
temp-buffer,
1,1,8 * sizeof(CGFloat),components,
targetColorSpace,
kCGBitmapFloatComponents );
CGContextSetFillColorWithColor(temp-bmp,source);
CGContextFillRect(temp-bmp,CGRectMake(0,0,1,1));
CGColor target = CGColorCreate(targetColorSpace,temp-buffer);
/* then you cleanup and destroy created objects */
No probé este código, podría necesitar algunas correcciones.
La respuesta oficial de Apple al rdar # 12141580 donde CGColorTransform
exposición de CGColorTransform
:
Muchas gracias por tus comentarios.
La ingeniería ha determinado que el comportamiento no se modificará según la siguiente información:
Utilice ColorSync.
Si tiene preguntas sobre la resolución de este problema, actualice su informe de errores con esa información.
Ahora estamos cerrando este informe de error.
Asegúrese de revisar periódicamente las nuevas versiones de Apple para ver si hay actualizaciones que puedan afectar este problema.
Quien haya escrito esa respuesta obviamente se sintió obligado a explicar la decisión con gran detalle. Especialmente una decisión que recomienda el uso de una API altamente compleja como ColorSync.