Red de conocimiento informático - Problemas con los teléfonos móviles - Las diferencias y conexiones entre UIColor, CGColor y CIColor

Las diferencias y conexiones entre UIColor, CGColor y CIColor

I.UIColor

UIColor es una clase importante en UIKit para almacenar información de color. El objeto UIColor contiene valores de color y transparencia, y su espacio de color se ha optimizado para IOS. UIColor contiene métodos de clase para crear algunos de los colores más comunes, como blanco, negro, rojo, transparente, etc. Estos colores tienen diferentes espacios de color (kCGColorSpaceDeviceGray para blanco y negro, kCGColorSpaceDeviceGray para rojo, kCGColorSpaceDeviceGray para rojo, etc.). Estos colores tienen diferentes espacios de color (kCGColorSpaceDeviceGray para blanco y negro, kCGColorSpaceDeviceRGB para rojo).

Además, UIColor tiene dos propiedades importantes: una es CGColor y la otra es CIColor (agregada después de 5.0). Estas dos propiedades pueden conectar los tres objetos UIColor, CGColor y CIColor. La conversión entre estos tres objetos se describirá en detalle más adelante.

En segundo lugar, CGColor

CGColor se usa principalmente en el marco CoreGaphics. CGColor es en realidad una estructura cuando usamos CGColor, generalmente usamos su tipo de referencia CGColorRef. CGColor se compone principalmente de CGColorSapce y Color Components. Los componentes de color constan de dos partes. Para el mismo componente de color, si el espacio de color es diferente, los resultados pueden ser diferentes. Esto es como cuando procesamos datos de imágenes, si tratamos el formato RGBA como formato BGRA, los resultados se pueden imaginar. En Quartz 2D, CGColor se usa generalmente para establecer el color de relleno del contexto, establecer la transparencia, etc.

1. Cómo crear CGColor La función más utilizada es CGColorCreate. Esta función tiene dos parámetros:

1) espacio de color, especifica el espacio de color correspondiente a CGColor, Quartz lo recuperará. el objeto, para que el objeto pueda liberarse de forma segura después de la llamada.

2) componentes, matriz de elementos CGFloat, su número es el número de componentes de color n en el espacio de color especificado, más el valor alfa correspondiente.

Esta función devuelve un CGColorRef recién creado, que se puede liberar usando la función CGColorRelease cuando ya no se use.

2. Obtener datos de CGColor

Cuando creamos CGColorRef, pasaremos dos parámetros importantes. Cuando obtengamos CGColorRef, por supuesto, podemos obtener el ColorSpace y los componentes correspondientes.

1) Obtener el espacio de color

A través de la función CGColorGetColorSpace, podemos obtener el espacio de color correspondiente al CGColorRef actual. Esta función solo acepta un parámetro, que es el espacio de color que usted. desea obtener.

Aquí hay un ejemplo simple:

CGColorRef cgColor = [UIColor redColor].CGColor; CGColorSpaceRef colorSpace = CGColorGetColorSpace(cgColor(@"color space: @", colorSpace);

< p); >2) Obtener componentes de color

Para obtener el valor de color correspondiente a CGColorRef, necesitamos usar las funciones CGColorGetNumberOfComponents y CGColorGetComponents. Echemos un vistazo a los prototipos de función de estas dos funciones:

size_t CGColorGetNumberOfComponents (color CGColorRef);

constCGFloat *CGColorGetComponents (color CGColorRef);

One La función se usa para obtener la cantidad de componentes de color contenidos en CGColorRef, y la segunda función se usa para obtener la matriz real de componentes de color; consulte un pequeño ejemplo a continuación:

NSUInteger num =CGColorGetNumberOfComponents( cgColor) ;

constCGFloat *colorComponents =CGColorGetComponents(cgColor);

for(inti = 0; i lt; num; i) { NSLog(@"componentes de color d:f", i , colorComponents[i]); }

3. CIColor

CIColor se utiliza principalmente junto con otras clases en el marco de imágenes central, como CIFilter, CIContext y CIImage. Hoy nos centramos principalmente en la parte de los valores de color. El rango de valores de color en CIColor está entre 0,0 y 1,0, 0,0 representa el valor mínimo del componente de color y 1,0 representa el valor máximo del componente de color. Los valores alfa también varían de 0,0 a 1,0, donde 0,0 representa completamente transparente y 1,0 representa completamente opaco, y los componentes de color CIColor generalmente no multiplican los valores alfa.

Podemos usar la función initWithCGColor: para crear CIColor a partir de CGColor, donde el objeto CGColorRef entrante puede ser cualquier espacio de color, pero el marco Core Image convertirá todos los espacios de color a Core Image antes de pasar el color del núcleo del filtro. espacio. Espacio de color de trabajo de imagen central. El espacio de color de trabajo de la imagen principal utiliza tres componentes de color más un componente alfa (en realidad kCGColorSpaceDeviceRGB), que verificaremos más adelante en este ejemplo.

IV.Diferencias y conexiones entre UIColor, CGColor y CIColor

1. Los dos atributos de UIColor CGColor y CIColor

El CGColor de UIColor siempre es válido, sin importar cuál sea. es Sin embargo, si se crea a través de CGColor, CIColor u otros métodos, la propiedad CIColor no siempre es válida. Solo es válida cuando UIColor se crea a través de CIColor; de lo contrario, acceder a esta propiedad generará una excepción:

//prueba init uicolor con CGColor

UIColor *color =[UIColor colorWithCGColor:[UIColor whiteColor]]. NSLog(@"CGColor from UIColor @", color.CGColor);

//No usar la propiedad CIColor

/Esta propiedad genera una excepción si el objeto de color no se inicializó con un color de imagen central.

NSLog(@"CIColor from UIColor @", color.CIColor //crush

2. > Cuando UIColor se inicializa con CGColor, toda la información contenida en CGColorRef se conservará intacta, incluido el espacio de color. También podemos ver que si UIColor se inicializa con CGColor, UIColor en realidad retiene directamente una copia del objeto CGColorRef.

Los ejemplos son los siguientes:

//test kCGColorSpaceDeviceCMYK

CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK(); CGFloat cmykValue[] = {1, 1, 0, 0, 1}; 0, 1}; //azul

CGColorRef colorCMYK =CGColorCreate(cmykSpace, cmykValue); CGColorSpaceRelease(cmykSpace); NSLog(@"colorCMYK:CGColorSpaceRelease(cmykSpace); NSLog(@"colorCMYK:@", colorCMYK) ;

//color con CGColor, uicolor simplemente lo retendrá

UIColor *color =[UIColor colorWithCGColor: colorCMYK]; color);

3. Use CIColor para inicializar UIColor

A continuación discutiremos que cuando use CIColor para inicializar UIColor y luego acceder a la propiedad CGColor de UIColor, encontraremos que el espacio de color de CGColor es diferente del de UIColor. Los espacios de color para configurar CIColor no son exactamente los mismos. Durante este proceso, CIColor convertirá por nosotros el uso de tres espacios de color: kCGColorSpaceDeviceGray, kCGColorSpaceDeviceRGB y kCGColorSpaceDeviceCMYK. para inicializar un CIColor y luego usar CIColor para inicializar uno UIColor, luego acceder a CIColor para inicializar un UIColor y luego acceder a CIColor Luego acceda a su propiedad CIColor, propiedad CGColor, vea el espacio de color e imprima la información de color.

1) Utilice kCGColorSpaceDeviceGray para inicializar CIColor

Primero verifique el código:

//pruebe kCGColorSpaceDeviceGray

NSLog(@"CGColor white color: @", [UIColor whiteColor], [UIColor whiteColor], [UIColor whiteColor], [UIColor whiteColor], [UIColor whiteColor], [UIColor whiteColor]) [UIColor whiteColor].CGColor); CIColor *ciColor =[CIColor colorWithCGColor :[ UIColor whiteColor].CGColor]; NSLog(@"cicolor: @", ciColor(@"cicolor colorspace: @", ciColor.colorSpace); color =[UIColor colorWithCIColor:ciColor]; @" , color);

//Imagen principal