Konvertierung der Formate ARGB8888 und ARGB1555


Vorwort

Ich habe mich kürzlich mit Bildfarbformaten befasst und muss die Konvertierung von Bildfarbformaten verwenden, die hier aufgezeichnet wird.


1. RGB-Farbraum

  • Der RGB-Farbraum basiert auf drei Grundfarben: R (Rot: Rot), G (Grün: Grün) und B (Blau: Blau), die in unterschiedlichem Maße überlagert werden, um satte und farbenfrohe Farben zu erzeugen, die allgemein als bekannt sind Drei Primärfarbenmodus.
  • Wissenschaftler haben herausgefunden, dass die drei Farben Rot, Grün und Blau in unterschiedlichen Anteilen synthetisiert werden können und sich zu jeder anderen Farbe entwickeln können.

2. Gängige Formate

  • RGB888: Gibt an, dass R, G und B jeweils durch 8 Bit (1 Byte) dargestellt werden, mit insgesamt 24 Bit (3 Byte), auch 24 Bit breit genannt.
  • RGB565: Zeigt an, dass R durch 5 Bits, G durch 6 Bits und B durch 5 Bits dargestellt wird, insgesamt 16 Bits (2 Bytes) und 16 Bits breit.
  • ARGB1555: Zeigt an, dass A (ob transparent oder nicht) durch 1 Bit und RGB durch jeweils 5 Bit dargestellt wird.

3. Formatkonvertierung

Von groß nach klein
Zum Beispiel: RGB888 bis RGB565
erfordern eine Quantisierungskomprimierung, um 8-Bit-Daten in 5-Bit und 6-Bit zu komprimieren; Komprimierungsregel: Nehmen Sie das hohe Bit, zum Beispiel: 8-Bit bis 5-Bit, nehmen Sie das hohe 5-Bit und konvertieren Sie dann die erhaltenen RGB-Daten in der Reihenfolge RGB565.
Die Quantisierung wird komprimiert, aber die Genauigkeit geht verloren .

Von klein nach groß
. Beispiel: RGB565 bis RGB888
erfordern eine Quantisierungskompensation; Kompensationsregeln: Füllen Sie die Originaldaten bis zu den hohen Bits und verwenden Sie für die niedrigen Bits die niedrigen Bits der Originaldaten zum Ausgleich. Wenn noch nicht gefüllte Bits vorhanden sind Verwenden Sie weiterhin die niedrigen Bits der Originaldaten zum Zyklus. Kompensieren.

4. Gegenseitige Konvertierung von ARGB8888 und 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. Zusammenfassung

Sie müssen wissen, dass die Konvertierung von groß nach klein an Präzision verliert. Nach der Farbkomprimierung unterscheidet sich die Farbe von der Originalfarbe! Die Farbe, die ich hier ausprobiert habe, wird heller sein als die Originalfarbe.

Ich denke du magst

Origin blog.csdn.net/weixin_37926485/article/details/127862610
Empfohlen
Rangfolge