Autor Thema: Umwandlung 24-bit -> 8 bit  (Gelesen 6166 mal)

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« am: 11. April 2005, 16:58 »
Ich quäle mich gerade mit einem kleinen Stück Code, das in bisher 3 verschiedenen Varianten noch nie funktioniert hat.

Ich möchte eine 24-bit-RGB-Farbe (0xRR, 0xGG, 0xBB) in eine 8-bit(6-bit)-Farbe umwandeln (00BBGGRRb).

struct RGBColor8
{
unsigned Red   :2;
unsigned Green :2;
unsigned Blue    :2;
unsigned Zero  :2;
};

struct RGBColor24
{
BYTE Red;
BYTE Green;
BYTE Blue;
};


Mit dieser Funktion:

void SetPixel(WORD wX, WORD wY, const struct RGBColor24 *pstrColor)
{
struct RGBColor8 bColor;
BYTE *pbColor;
bColor.Red = pstrColor->Red / 64;
bColor.Green = pstrColor->Green / 64;
bColor.Blue = pstrColor->Blue / 64;
bColor.Zero = 0;
pbColor = &bColor;
pbVGAMemory[wY*320 + wX] = *pbColor;
return;
}


Was ist da falsch? Ich habe es auch schon ohne Bitfelder benutzt, einfach mit Shifts und ANDs und ORs und ADDs, aber nie hat's geklappt. Die 8-bit Farbe hat nie mit der 24-bit übereingestimmt.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 11. April 2005, 17:43 »
8 bit kann ja auch nicht mit 24 bit übereinstimmen da es weniger informationen beherbergt. Ausserdem da du durch 64 teilst nimmst du von den jeweils 8 Bit einer Farbe nur die obersten beiden raus und speicherst sie. Also wirst du erst dann einen unterschied merken wenn die änderungen der farben die oberen beiden bits ändern
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 11. April 2005, 17:47 »
Genau. Streng genommen ist es eine Umwandlung 24 bit -> 6 bit. Aber sie funktioniert nicht. Um genau zu sein: Aus jeder X-beliebigen 24-bit-Farbe wird immer dasselbe Grün.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 11. April 2005, 17:48 »
Wie gesagt nimmst du nur die obersten Bits.
Nimm z.B. das Oberste und das Mittlere oder so, dann erhälst du schon eher etwas sinnvolles.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 11. April 2005, 17:57 »
Hier noch die vielleicht einfacher zu verstehende Funktion ohne Bitfelder:

void SetPixel(WORD wX, WORD wY, const struct RGBColor24 *pstrColor)
{
BYTE bColor;
bColor = (pstrColor->Red / 64);
bColor |= (pstrColor->Green / 64) << 2;
bColor |= (pstrColor->Blue / 64) << 4;
pbVGAMemory[wY*320 + wX] = bColor;
return;
}

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 11. April 2005, 18:06 »
Keine Angst, eine zutreffende Palette ist schon eingerichtet. Und ich habs auch mit direktem schreiben in den Grafikspeicher getestet.

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 11. April 2005, 22:25 »
Ich habe das Problem gefunden: Mein Stacksegment ist nicht dasselbe wie die andern Segmente. Komisch, dass bei einer andern Funktion noch nicht aufgefallen ist. Kann ich das irgendwie in der Linkerfile oder so anpassen oder muss ich den Stack ins gleiche Segment wie den Rest packen?

 

Einloggen