UI, CG y CI para procesamiento de imágenes en iOS
Aunque UIImage puede cargar y mostrar mapas de bits en varios formatos, incluso puede cargar imágenes simultáneamente y luego reproducir varias imágenes en secuencia para formar una animación. Pero una UIImage no puede escalar, rotar o "excavar" un área específica de la imagen de origen, lo cual es posible con CGImageRef de Quartz 2D. UIImage y CGImageRef se pueden convertir entre sí, y CGImageRef no es una API o clase orientada a objetos, es solo un tipo de puntero que se puede usar para crear animaciones. Quartz 2D define CGImageRef como:
CGImage y CGImageRef son clases utilizadas para volver a dibujar gráficos. Se utilizan para dibujar imágenes basadas en la matriz de píxeles de la imagen y se pueden utilizar para procesar mapas de bits.
El sistema mantiene una pila CGContextRef y UIGraphicsGetCurrentContext() obtendrá CGContextRef en la parte superior de la pila. El enfoque correcto es llamar únicamente a UIGraphicsGetCurrentContext() en drawRect, porque el sistema insertará un CGContextRef válido en la pila antes de dibujarRect, y no debería obtener el CGContextRef en ningún otro lugar a menos que mantenga uno usted mismo.
UIColor es una clase importante en UIKit para almacenar información de color. Los objetos UIColor contienen 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., que tienen diferentes espacios de color (kCGColorSpaceDeviceGray para blanco y negro, kCGColorSpaceDeviceRGB para rojo). UIColor tiene dos propiedades importantes: una es la propiedad CGColor y la otra es la propiedad CIColor (agregada después de 5.0).
CGColor se usa principalmente en el marco CoreGaphics. CGColor es en realidad una estructura. Generalmente usamos su tipo de referencia CGColorRef cuando usamos CGColor. CGColor consta principalmente de dos partes: CGColorSapce y Color Components. CGColor se compone principalmente de dos partes: CGColorSapce y Color Components. Si el espacio de color del mismo color es diferente, los resultados del análisis también 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.
CIColor se utiliza principalmente para interactuar con otras clases en el marco de imágenes central, como CIFilter, CIContext y CIImage. El rango de valores de color de CIColor está entre 0,0 y 1,0, donde 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 oscilan entre 0,0 y 1,0, siendo 0,0 completamente transparente y 1,0 completamente opaco. Los componentes de color CIColor generalmente no se multiplican por los valores alfa.
CIColor se puede crear a partir de un CGColor usando la función initWithCGColor:, donde el objeto CGColorRef pasado puede ser cualquier espacio de color, pero el marco de Core Image convierte todos los espacios de color al espacio de color de trabajo de Core Image antes de pasar el núcleo del filtro. El espacio de color de trabajo de la imagen principal utiliza tres componentes de color más un componente alfa (en realidad, kCGColorSpaceDeviceRGB).
Independientemente de si UIColor se crea usando CGColor, CIColor u otros métodos, su propiedad CGColor siempre es válida; sin embargo, la propiedad CIColor no siempre es válida y solo es válida cuando UIColor se crea usando CIColor; acceso Esta propiedad generará una excepción.
Cuando UIColor se crea como CIColor, la propiedad CIColor no siempre es válida.
Cuando UIColor se inicializa con CGColor, toda la información contenida en CGColorRef (incluido el espacio de color) se conservará. El siguiente ejemplo muestra que si UIColor se inicializa con CGColor, entonces UIColor es en realidad una copia directa de CGColorRef. UIColor conserva una copia del objeto CGColorRef.
Al usar CIColor para inicializar UIColor y luego acceder a la propiedad CGColor de UIColor, encontraremos que el espacio de color de CGColor no es exactamente el mismo que el espacio de color de configuración de CIColor. En este proceso, CIColor lo hará. establezca UIColor para el espacio de color UIColor. CIColor hará la conversión por nosotros durante este proceso. Inicialice CIColor usando kCGColorSpaceDeviceGray, kCGColorSpaceDeviceRGB, kCGColorSpaceDeviceCMYK, luego inicialice UIColor usando CIColor, luego acceda a sus propiedades CIColor, propiedades CGColor, vea el espacio de color e imprima información de color.
Al ejecutar el programa, podemos ver que si CIColor se inicializa con CGColor con el espacio de color kCGColorSpaceDeviceGray, podemos ver que el espacio de color de CIColor siempre ha sido kCGColorSpaceDeviceGray, y al acceder a la propiedad CIColor de UIColor, podemos Al ver que su espacio de color es kCGColorSpaceDeviceGray, podemos ver que su espacio de color sigue siendo kCGColorSpaceDeviceGray, pero al acceder 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. se ha cambiado del espacio de color original. Convertir correctamente al nuevo espacio de color.
A lo largo del proceso de impresión de CIColor y los valores a los que se accede a través de las propiedades CGColor y CIColor de UIColor, podemos ver que todos están en el espacio kCGColorSpaceDeviceRGB.
Cuando inicializamos CIColor con un CGColor en el espacio de color CMYK, el espacio de color de CIColor sigue siendo CMYK, pero los valores de color se convierten a valores de color RGB.
Al usar este CIColor para crear un UIColor e imprimir la información a través de las propiedades CIColor y CGColor, encontraremos que el espacio de color de CIColor sigue siendo CMYK, pero la información impresa de CGColor parece haberse convertido a RGB.
Acerca de la creación de CGColor
La función más utilizada es CGColorCreate, que tiene dos parámetros:
Esta función devuelve un CGColorRef recién creado cuando ya no lo tenemos. se utiliza cuando se utiliza el objeto. La función CGColorRelease se utiliza cuando ya no utilizamos el objeto.
Obtener datos de CGColor
Cuando creamos CGColorRef, pasaremos dos parámetros importantes. Cuando obtengamos CGColorRef, podremos obtener el ColorSpace y los componentes correspondientes. La primera función obtiene el número de componentes de color contenidos en CGColorRef, y la segunda función obtiene una matriz de componentes de color reales.
Determinar si dos colores son iguales
Ya sea que UIColor se inicialice usando CIColor, CGColor u otros métodos, la propiedad CGColor siempre está disponible y CoreGraphics proporciona una manera de determinar si dos CGColors método de igualdad. Por lo tanto, podemos determinar si dos UIColors son iguales determinando si son iguales.
La primera parte del ejemplo es determinar si dos UIColors blancos son iguales, aunque ambos sean blancos pero en espacios de color diferentes. La segunda parte del ejemplo simplemente crea dos UIColors en el espacio RGB y al ejecutar el programa se muestra que los dos colores son iguales.