Directorio de artículos
prefacio
Recientemente, he estado estudiando los formatos de color de las imágenes y necesito utilizar la conversión de formato de color de las imágenes, que se registra aquí.
1. Espacio de color RGB
- El espacio de color RGB se basa en tres colores básicos: R (rojo: rojo), G (verde: verde) y B (azul: azul), que se superponen en distintos grados para producir colores ricos y coloridos, comúnmente conocidos como Tres modos de color primario.
- Los científicos han descubierto que los tres colores rojo, verde y azul pueden sintetizarse en diferentes proporciones y evolucionar a cualquier otro color.
2. Formatos comunes
- RGB888: Indica que R, G y B están representados por 8 bits (1Byte) respectivamente, con un total de 24 bits (3Bytes), también llamados 24 bits de ancho.
- RGB565: Indica que R está representado por 5 bits, G está representado por 6 bits y B está representado por 5 bits, un total de 16 bits (2Bytes), 16 bits de ancho.
- ARGB1555: Indica que A (ya sea transparente o no) está representado por 1 bit y RGB está representado por 5 bits respectivamente.
3. Conversión de formato
De grande a pequeño
Por ejemplo: RGB888 a RGB565
requiere compresión de cuantificación para comprimir datos de 8 bits en 5 bits y 6 bits; regla de compresión: tome el bit alto, por ejemplo: de 8 bits a 5 bits, tome el bit alto 5 bits y luego convierta los datos RGB obtenidos, ordenados en el orden RGB565.
La cuantificación se comprime, pero se pierde precisión .
De pequeño a grande
. Por ejemplo: RGB565 a RGB888
requiere compensación de cuantificación; reglas de compensación: complete los datos originales hasta los bits altos y, para los bits bajos, use los bits bajos de los datos originales para compensar. Si todavía hay bits sin completar. , continúe usando los bits bajos de los datos originales para compensar.
4. Conversión mutua de ARGB8888 y ARGB8888
#include <stdio.h>
#include <stdint.h>
unsigned int Rgb888toArgb8888(unsigned int rgb24, int a)
{
if(a <= 0)
return 0;
return (a << 24) + rgb24;
}
unsigned int argb1555_to_argbB8888(unsigned short c)
{
const unsigned int a = c&0x8000, r = c&0x7C00, g = c&0x03E0, b = c&0x1F;
const unsigned int rgb = (r << 9) | (g << 6) | (b << 3);
return (a*0x1FE00) | rgb | ((rgb >> 5) & 0x070707);
}
unsigned short argb8888_to_argb1555(unsigned int color)
{
unsigned int a = (((color&0xff000000)>>24) +127)/255;
unsigned int r = (((color&0x00ff0000)>>16)*31 +127)/255;
unsigned int g = (((color&0x0000ff00)>>8)*31 +127)/255;
unsigned int b = (((color&0x000000ff))*31 +127)/255;
unsigned short argb1555 = (a << 15) | (r << 10) | (g << 5) | b;
return argb1555;
}
int main(int argc, char *argv[])
{
unsigned int rgb32 = Rgb888toArgb8888(0x92d050, 0xff);
printf("rgb32:%x\n", rgb32);
unsigned short argb1555 = argb8888_to_argb1555(rgb32);
printf("argb1555:%x\n", argb1555);
unsigned int color = argb1555_to_argbB8888(argb1555);
printf("argb8888:%x\n", color);
return 0;
}
5. Resumen
Lo que necesita saber es que la conversión de grande a pequeño perderá precisión y, después de la compresión del color, será diferente del color original. El color que probé aquí será más claro que el color original.