Programación Kcg
UIColor es una clase importante en UIKit que almacena 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 algunos métodos de clase para crear algunos de los colores más comunes, como blanco, negro, rojo, colores transparentes, etc. Los espacios de color de estos colores también son diferentes (kCGColorSpaceDeviceGray para blanco y negro, kCGColorSpaceDeviceRGB para rojo).
Además, UIColor tiene dos atributos importantes: uno es CGColor y el otro es cicolor (agregado después de 5.0). Estas dos propiedades pueden vincular tres objetos: UIColor, CGColor y CIColor. La conversión entre ellos se presentará en detalle más adelante.
En segundo lugar, CGColor
CGColor se usa principalmente en el marco CoreGaphics. En realidad, cuando usamos CGColor, generalmente usamos su tipo de referencia CGColorRef. CGColor se compone principalmente de CGColorSapce y Color.
El componente se compone de dos partes con el mismo color. Si el espacio de color es diferente, los resultados del análisis pueden ser diferentes. Esto es como cuando procesamos datos de imágenes, podemos imaginar el resultado del procesamiento del formato RGBA como formato BGRA. Material de cuarzo
En 2D, CGColor se suele utilizar para establecer el color de relleno y la transparencia del fondo.
1. Cómo crear un CGColor La función más utilizada es CGColorCreate, que tiene dos parámetros:
1) espacio de color, especifica el espacio de color correspondiente a CGColor, Quartz lo conservará. el objeto, por lo que puede liberar el objeto de forma segura después de llamarlo.
2) componentes, una matriz de CGFloat, el número de elementos es el número n de componentes de color contenidos en el espacio de color especificado más el valor alfa correspondiente.
Esta función debería devolver un CGColorRef recién creado. Cuando ya no usemos este objeto, use la función CGColorRelease para liberarlo.
2. Obtener datos de CGColor.
Cuando creamos, pasamos dos parámetros importantes. Cuando obtenemos CGColorRef, por supuesto podemos obtener el espacio de color y los componentes correspondientes.
1) Consigue el espacio de color.
A través de la función CGColorGetColorSpace podemos obtener el ColorSpace correspondiente al CGColorRef actual, y esta función solo acepta un parámetro, que es el CGColorRef del ColorSpace que desea obtener. Veamos un ejemplo sencillo:
CGColorRef CG color =[ui color red color]. CGColor
cgcolorspace ref colorSpace = CGColorGetColorSpace(color CG);
NSLog(@"Espacio de color:%@", espacio de color);
2) Obtener Componentes de color
Para obtener el valor de color correspondiente a CGColorRef, necesitamos usar dos funciones: CGColorGetNumberOfComponents y CGColorGetComponents.
Veamos primero los prototipos de función de las dos funciones:
size _ t CGColorGetNumberOfComponents(
CGColorRef color
);
const CG float * CGColorGetComponents(
CGColorRef color
);
La primera función es obtener el número de componentes de color contenidos en CGColorRef, y la segunda función es para obtener una matriz de componentes de color reales. Veamos un pequeño ejemplo:
nsu entero num = CGColorGetNumberOfComponents(color CG);
const CG float * componentes de color = CGColorGetComponents(color CG);
for(int I = 0;i<num++i) {
NSLog(@ "Componente de color %d: %f ",I,componentes de color[I]);
}
Tres. CIColor
CIColor se utiliza principalmente en y núcleo.
Otras clases en el framework de imágenes, como CIFilter, CIContext y CIImage. Hoy, nuestro enfoque principal está en los valores del color. El rango de valores de color en CIColor está entre 0,0 y 1,0, donde 0,0 significa que el componente de color es el valor mínimo y 1,0 significa que el componente de color se convierte en el valor máximo. Entre ellos, el valor alfa varía de 0,0 a 1,0, donde 0,0 representa transparencia total y 1,0 representa opacidad total, y el componente de color de CIColor generalmente no se multiplica por el valor alfa.
Podemos usar la función initWithCGColor: para crear un CIColor a través de CGColor. El objeto CGColorRef pasado se puede convertir en cualquier espacio de color, pero el marco de Core Image convertirá todos los espacios de color en el espacio de color de trabajo de Core Image y luego lo pasará al núcleo del filtro. El espacio de color de trabajo de la imagen principal consta de tres componentes de color más un componente alfa (en realidad kCGColorSpaceDeviceRGB), que verificaremos en el siguiente ejemplo.
Cuatro. Las diferencias y conexiones entre UIColor, CGColor y CIColor
1 Hay dos propiedades de UIColor: CGColor y CIColor.
CGColor de UIColor siempre es válido, ya sea que se cree con CGColor, CIColor u otros métodos, el atributo CGColor siempre es válido, pero el atributo CIColor no siempre es válido. CIColor; de lo contrario, se produce una excepción al acceder a esta propiedad. Como es habitual, aquí tenéis un pequeño ejemplo:
//Prueba init uicolor con CGColor
ui color * color =[ui color colorwithgccolor:[ui color white color]. CG color];
//La propiedad CGColor siempre es válida
NSLog(@"CGColor from UIColor %@"), color. CG color);
//No utilice la propiedad CIColor
//Esta propiedad generará una excepción si el objeto de color no se inicializa con el color principal de la imagen.
NSLog(@"CIColor de UIColor %@"), color. CIColor); //Rolling
2.UIColor se inicializa con CGColor.
Cuando UIColor se inicializa con CGColor, toda la información contenida en CGColorRef se conservará intacta, incluido el color.
Espacio, y a través del siguiente pequeño ejemplo, también podemos ver que si usa CGColor para inicializar UIColor, UIColor en realidad retiene directamente una copia del objeto CGColorRef. El ejemplo es el siguiente:
//Test kCGColorSpaceDeviceCMYK
cgcolorspace ref cmykSpace = cgcolorspace createevicecmyk();
CGFloat cmykValue[] = {1, 1, 0, 0, 1 }; // azul
CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue); "colorCMYK : %@ ", colorCMYK);
//Coloreado con CGColor, uicolor solo lo retendrá
ui color * color =[ui color colorwithgccolor:colorCMYK]; p>
NSLog(@ "CG Color de UIColor:% @ ", color.CG color);
3.UIColor se inicializa con CIColor.
Discutamos que cuando inicializamos un UIColor usando CIColor y luego accedemos a la propiedad CGColor de UIColor, encontraremos el color de CGColor.
Configuración de espacio y color.
Los espacios no son exactamente iguales, CIColor nos hará una transformación en el proceso. Veamos cómo inicializar un CIColor usando tres espacios de color: kcgcolorspacedicegray, kCGColorSpaceDeviceRGB y kCGColorSpaceDeviceCMYK, luego inicialicemos un UIColor usando CIColor y luego accedamos a su género CIColor y propiedades CGColor para ver el espacio de color e imprimir información de color.
1) Utilice kCGColorSpaceDeviceGray para inicializar CIColor.
Primer vistazo al código:
//Prueba kCGColorSpaceDeviceGray
NSLog(@"CG color white:%@",[UIColor white].CG color );
CIColor * CIColor =[CIColor colorwithgccolor:[ui color color blanco]. Color CG];
NSLog(@"cicolor: %@ ",ciColor);
NSLog(@"cicolor colorspace: %@ ",cicolor . espacio de color); p>
p>
color =[ui color colorWithCIColor:ciColor];
NSLog(@"color %@ ", color);
//Imagen principal convierte todos los espacios de color Trabaja en el espacio de color
// de la imagen principal y luego pasa el espacio de color al núcleo del filtro.
//kcgcolorspacedicegray-& gt;kCGColorSpaceDeviceRGB
NSLog(@"cicolor de UIColor: %@ ", color.CIColor);
NSLog(@" espacio de color de cicolor: %@ ", color. cicolor . espacio de color);
NSLog(@"color's CGColor: %@ ", color. CG color);
Pasar Ejecutando el programa podemos ver que si inicializamos CIColor con un CGColor en el espacio de color de kcgcolorspacedicegray, podemos ver que el espacio de color de CIColor siempre ha sido kcgcolorspacedicegray. Al acceder a la propiedad CIColor de UIColor, podemos ver que su espacio de color sigue siendo kCGColorSpaceDeviceGray, pero cuando accedemos a la propiedad CGColor de UIColor, podemos encontrar que su espacio de color se ha convertido al espacio kCGColorSpaceDeviceRGB mediante la impresión y el valor del color tiene se ha cambiado correctamente respecto al original. El espacio de color se convierte en un nuevo espacio de color.
2) Inicialice CIColor con kCGColorSpaceDeviceRGB.
De manera similar, veamos el código:
//Test kCGColorSpaceDeviceRGB
NSLog(@"CG color red:%@",[UIColor redColor]. CG color);
CIColor * CIColor =[CIColor colorwithgccolor:[ui color color rojo]. Color CG];
NSLog(@"cicolor: %@ ",ciColor);
NSLog(@"cicolor colorspace: %@ ",cicolor . espacio de color); p>
p>
ui color * color =[ui color color withcicolor:ciColor];
NSLog(@"color %@ ", color);
NSLog(@"cicolor de UIColor: %@ ", color. CIColor);
NSLog(@"espacio de color de cicolor: %@ ", color. cicolor . espacio de color
NSLog(@ "color's CGColor: %@", color. CG color);
Durante todo el proceso, imprimiendo CIColor y los valores a los que se accede a través de las propiedades CGColor y CIColor de UIColor, podemos encontrar que todos están en el centro del espacio kCGColorSpaceDeviceRGB.
4. Inicialice CIColor con kCGColorSpaceDeviceCMYK.
Sigamos mirando un fragmento de código:
//Test kCGColorSpaceDeviceCMYK
cgcolorspace ref cmykSpace = cgcolorspace createevicecmyk();
NSLog( @ "Número de componente: %zu ", cgcolorspace getnumberofcomponents(cmykSpace));
CGFloat cmykValue[] = {1, 1, 0, 0, 1} // azul
CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);
cgcolorspace release(cmykSpace);
NSLog(@"colorCMYK: %@ ", colorCMYK);
ciColor =[ciColor colorwithgccolor:colorCMYK];
NSLog(@"cicolor: %@ ",ciColor); // De hecho, el valor de color de CIColor se ha convertido al espacio de color RGB.
NSLog(@"cicolor colorspace: %@ ",cicolor . espacio de color);
color =[ui color colorWithCIColor:ciColor];
NSLog( @"UIColor con CIColor: %@ ", color);
NSLog(@"cicolor de UIColor: %@ ", color.CIColor);
NSLog(@"cicolor's color space:%@ ", color. cicolor . color space);
//Cuando UIColor se inicializa con CIColor, CGColor de UIColor convertirá otros espacios de color a kCGColorSpaceDeviceRGB
NSLog(@ " from UIColor CG color:%@",color.CG color);
Durante todo el proceso, también podemos encontrar que cuando inicializamos CIColor con un CGColor en el espacio de color CMYK, el espacio de color de CIColor es Todavía es CMYK, pero los valores de color se han convertido a valores de color RGB. Utilice este CIColor para crear un UIColor. Cuando imprimimos información a través de las propiedades de CIColor y CGColor, encontraremos que el espacio de color de CIColor sigue siendo CMYK, pero la información impresa por CGColor se ha convertido al espacio RGB.
Extensión UIColor de verbo (abreviatura de verbo), ¿cómo determinar si dos colores son iguales?
Como se mencionó anteriormente, ya sea que UIColor se inicialice mediante CIColor, CGColor u otros métodos, su propiedad CGColor está disponible. CoreGraphics proporciona un método para determinar si dos CGColors son iguales, de modo que podamos determinar si dos UIColors son iguales. Aquí hay un ejemplo simple:
//Determine si dos CGColors son iguales
if(cgcolorecequaltocolor([ui color white color]).CGColor, [ui color colorWithRed:1 green : 1 azul: 1 alfa: 1].
CGColor)) {
NSLog(@"¡Dos CGColors son iguales!");
}
De lo contrario{
NSLog(@ "¡Estos dos CGColors no son iguales!");
}
if(cgcolorecequaltocolor([ui color colorWithRed:1 green:1 blue:1 alpha:1].CGColor,[ ui color colorWithRed:1 verde:1 azul:1 alfa:1]. CGColor)) {
NSLog(@"¡Dos CGColors son iguales!");
}
De lo contrario{
NSLog(@ "¡Estos dos CGColors no son iguales!");
}
La primera parte del ejemplo es juzgue los dos si el UIColor blanco es igual. Aunque ambos son blancos, los espacios de color son diferentes. Al ejecutar, podemos encontrar que "El" está impreso.
¡Dos CGColors no son
iguales! ". La segunda parte del ejemplo simplemente crea dos UIColors en el espacio RGB. Al ejecutar el programa, puede ver que los dos colores son iguales.