Conversión de formato ARGB8888 y ARGB1555


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.

Supongo que te gusta

Origin blog.csdn.net/weixin_37926485/article/details/127862610
Recomendado
Clasificación