![]() |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Liste der Anhänge anzeigen (Anzahl: 1)
Gibt folgende Variantionen:
Verzwickt :-( |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Sieht so aus :gruebel:
Gehen wir wieder zurück zur ersten Variante - probiere mal, die R, G und B jeweils paarweise zu vertauschen. [Nachtrag] wobei ich glaube, dass es nicht daran liegt. Ich denke mal, die nehmen eine spezielle Palette. |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Liste der Anhänge anzeigen (Anzahl: 1)
Habe ich schon probiert, dabei werden die orangen vierecke blau respektive grün, die reihenfolge stimmt also...
Ich habe noch dieses probiert:
Delphi-Quellcode:
Resultat siehe bild...r := ((AColor and $07) shl 1) * 16; g := ((AColor and $38) shr 2) * 16; b := ((AColor and $C0) shr 4) * 16; result := RGB(r, g, b); |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Schickst du mir mal eins von diesen KBM-Dingern (oder die fünf vom Beispiel)...
|
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Liste der Anhänge anzeigen (Anzahl: 1)
Das erste Bild beginnt nach 16 Bytes, also beim 17.
Alle Bilder sind 16'384 bytes gross. Bitte schalte den "Big Endian" modus ein im Hexeditor. Die Bytes sind vertauscht. Um die Word-Werte aus dem Header zu lesen habe ich die Swap funktion verwendet... |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Sind die nicht normalerweise indiziert? Also so daß es eine Farbtabelle gibt mit Indeces von 0-255 und dann eben die Farbwerte in der Farbtabelle stehen? :gruebel:
|
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Bei älteren KBM dateien für ältere Radios ist dies so...
Hier sind beie Varianten erwähnt: ![]() |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Ich glaube es muss was in diese Richtung sein...sieht schon fast identisch aus wie das original:
Delphi-Quellcode:
r := ((ab and $07) shl 1) shl 4;
g := ((ab and $38) shr 2) shl 4; b := (((ab and $C0) or (ab and $1) shl 5)); |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Also wenn ich's hier ausprobiere, dann ist der Rotstich zwar nicht mehr so drastisch wie bei dir aber immer noch da.
Delphi-Quellcode:
Man muss irgendwie das fehlende Bit in ROT so anpassen, dass es zu den anderen Farben passt - intern werden die wahrscheinlich eine dafür angepasste Palette nehmen.
procedure TForm1.LoadKBM(const Filename: string; Bitmap: TBitmap);
const kbmWidth = 256; kbmHeight = 5 * 64; type TBitmapInfo8 = packed record bmiHeader: TBitmapInfoHeader; bmiColors: array [0 .. 255] of TRgbQuad; end; var bfh: TBitmapFileHeader; bih: TBitmapInfo8; strm: TMemoryStream; fils: TFileStream; c, r, g, b: integer; begin FillChar(bfh, SizeOf(bfh), 0); with bfh do begin bfType := $4D42; bfSize := SizeOf(bfh) + SizeOf(bih) + kbmWidth * kbmHeight; bfOffBits := SizeOf(bfh) + SizeOf(bih); end; FillChar(bih, SizeOf(bih), 0); with bih.bmiHeader do begin biSize := SizeOf(TBitmapInfoHeader); biWidth := kbmWidth; biHeight := -kbmHeight; biPlanes := 1; biBitCount := 8; biCompression := BI_RGB; biSizeImage := kbmWidth * kbmHeight; biClrUsed := 256; end; for c := 0 to 255 do begin b := 1 * ((( c and 7) * 255) div 7); g := 1 * ((((c shr 3) and 7) * 255) div 7); r := 1 * (((((c shr 5) and 6) or ((c and 1) and ((c shr 3) and 1))) * 255) div 7); with bih.bmiColors[c] do begin rgbBlue := b; rgbGreen := g; rgbRed := r; end; end; strm := TMemoryStream.Create; try strm.WriteBuffer(bfh, SizeOf(bfh)); strm.WriteBuffer(bih, SizeOf(bih)); fils := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite); try fils.Position := 16; strm.CopyFrom(fils, kbmWidth * kbmHeight); finally fils.Free; end; strm.Position := 0; Bitmap.LoadFromStream(strm); strm.SaveToFile(ChangeFileExt(Filename, '.bmp')); finally strm.Free; end; end; Du kannst in dem Ausdruck
Delphi-Quellcode:
ein wenig herumspielen, um das fehlende Rot-Bit aus den anderen beiden zu holen.
((c and 1) and ((c shr 3) and 1))
Varianten:
Delphi-Quellcode:
((c and 1))
(((c shr 3) and 1)) ((c and 1) or ((c shr 3) and 1)) |
Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
Ok, besten Dank für deine hilfe, ich hoffe ich krieg das noch hin dieses jahr ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 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