![]() |
8 bit Color Byte zu 24 bit Farbe umrechnen
Hallo Zusammen
Ich bin kurz vor der Verzweiflung. Versuche schon seit Stunden ein Byte zu einem 24 bit Farbwert umzurechnen. Folgende Ausgangslage: Ich habe ein Byte, sagen wird mal
Delphi-Quellcode:
In Wikipeida stand, es gibt 2 Varianten von 8 Bit Farbe, entweder mit Palette oder "True Color" durch umrechnung. In mienem Fall wird keine Palette benutzt.
b := $FF; //Weiss
Bei der Variante ohne Palette werden 3 Bits für Red, 3 Bits für Green und 2 Bits für Blau benutzt. Kann mir jemand bei der Umrechnung helfen? Hier einige weitere Beispiele:
Delphi-Quellcode:
Beim Beispiel für $FF müsste ich demnach für R 255, B 255 und G 255 erhalten.
// B G R
b0 := $AD; //10 101 101 b1 := $F6; //11 110 110 b2 := $FF; //11 111 111 b3 := $09; //00 001 001 b4 := $00; //00 000 000 Grüsse Martin |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Delphi-Quellcode:
wird zwar nicht ganz weiß, aber bei 3-3-2-Bit :?:
function ColorByteTo24Bit (const AColor: Byte): TColor;
begin Result := Rgb ((AColor and $07) shl 5, (AColor and $38) shl 2, (AColor and $C0)); end; |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
hmmm, mit der Berechnung wird dat nicht's Richtiges:
Delphi-Quellcode:
R := (C and $07) * 36.428571;
G := ((C shr 3) and $07) * 36.428571; B := ((C shr 5) and $03) * 85; Also bleibt dann noch der einfache Weg über 'ne Tabelle. Entwerde du nimmst alle 256 Farbwerte in Eine auf, oder du erstellst nur kleine Tabellen, womit du dann jeden Farbwert inzeln berechnen kannst:
Delphi-Quellcode:
T3: Array[0..7] of Byte = (0, 36, ..., 219, 255);
T2: Array[0..3] of Byte = (0, 85, 170, 255); R := T3[C and $07]; G := T3[(C shr 3) and $07]; B := T2[(C shr 5) and $03]; C24 := T3[C8 and $07] or (T3[(C8 shr 3) and $07] shl 8) or (T2[(C8 shr 5) and $03] shl 16); [add] @Kroko: andersrum gehts auch ... dann wird's aber net mehr ganz Schwarz ^^
Delphi-Quellcode:
Result := Rgb ((((AColor + 1) and $07) - 1) shl 5,
(((AColor + 1) and $38) - 1) shl 2, ((AColor + 1) and $C0) - 1); |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Normalerweise löst man das über Bitwiederholungen:
Delphi-Quellcode:
function ColorByteTo24Bit (const AColor: Byte): TColor;
var R, G, B: Byte; begin R := (AColor and $07) shl 5; G := (AColor and $38) shl 2; B := (AColor and $C0); Result := RGB(R or (R shr 3) or (R shr 6), G or (G shr 3) or (G shr 6), B or (B shr 2) or (B shr 4) or (B shr 6)); end; |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Wieso wirds mit einer Berechnung nix?
dass muss doch einwandfrei gehen! einen 3 Bit Wert mit (255 / 7) zu multipizieren ergibt den entsprechenden 8 Bit wert ! DerDan |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
@DerDan: "nichts Richtiges" :zwinker:
klar wird dat was ... aber der "rechenaufwand" ist meiner Meinung nach nicht gerade angemessen. @Flocke: hmmm ... Bitwiederholung klingt och net schlecht |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Liste der Anhänge anzeigen (Anzahl: 1)
Herzlichen Dank für all eure Vorschläge!
Wie ich sehe geht dies auf Verschiedene X-Arten. Ich habe ein Referenz-Bild angehängt, das erste Bild das ihr auf dem Gif sieht, beginnt mit $AD. Wenn ich den Colorpicker nehme, erhalte ich für diesen Wert 176, 176, 176 Diese Bilder befinden sich in einem Bildformat für Kenwood Autoradios. Leider haben die diverse Formate, eines davon ist dieses 8bit Bildformat. Leider kann ich auf dem Gerät nicht "Debuggen" ;-) und muss nun herausfinden wie dieses diese Pixel berechnet |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
In welchem Format schiebst du das Bild denn auf das Gerät? GIFs haben übrigens Paletten.
|
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Das Format heisst KBM und wird wohl ein Kenwood eigenes Format sein.
Es hat einen 16-Bit grossen Header und ein paar Frames. Die einen Formate enthalten eine Palette, aber zu denen bin ich noch nicht gekommen. Bin nun an dem Formaten die ohne Palette arbeiten. Bei einem anderen warens 1.5 Byte pixel, also 12bit, da musste ich einfach 0.5 bytes mal 16 rechnen und ich hatte den richtigen wert. Aus den 8-bit Werten bin ich noch nicht ganz schlau geworden, sieht aber schon sehr ähnlich aus mit dem eurem Algorhytmus. Und so siehts noch ein wenig besser aus:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var ab : byte; r, g, b : byte; begin ab := $FF; //10 101 101 r := ab and $07 shl 5; g := ab and $38 shl 2; b := ab and $C0 + (ab and $01 shl 5); showmessage(inttostr(r)); showmessage(inttostr(g)); showmessage(inttostr(b)); end; |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Ich wollte eigentlich nur wissen, wie du das GIF-Bild erstellt hast - dafür hast du die Farben doch schon umwandeln müssen.
So kommst du nicht auf den vollen Wertebereich (bei deinen 4-Bit-Pixel übrigens auch nicht).
Code:
Versuche mal den Vorschlag von DerDan oder die Bit-shr-or-Operation von mir oben, dann ist Weiß auch weiß!
Gewollt:
0000 -> 00000000 1111 -> 11111111 Einfach x 16 0000 -> 00000000 1111 -> 11110000 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz