Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 8 bit Color Byte zu 24 bit Farbe umrechnen (https://www.delphipraxis.net/54060-8-bit-color-byte-zu-24-bit-farbe-umrechnen.html)

cyberblast 27. Sep 2005 14:52

Re: 8 bit Color Byte zu 24 bit Farbe umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Gibt folgende Variantionen:

Verzwickt :-(

Flocke 27. Sep 2005 14:58

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.

cyberblast 27. Sep 2005 15:05

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:

     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);
Resultat siehe bild...

Flocke 27. Sep 2005 15:09

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)...

cyberblast 27. Sep 2005 15:19

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...

Olli 27. Sep 2005 15:41

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:

cyberblast 27. Sep 2005 15:44

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:
http://en.wikipedia.org/wiki/8-bit_color

cyberblast 27. Sep 2005 16:06

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));

Flocke 27. Sep 2005 16:07

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:
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;
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.

Du kannst in dem Ausdruck
Delphi-Quellcode:
((c and 1) and ((c shr 3) and 1))
ein wenig herumspielen, um das fehlende Rot-Bit aus den anderen beiden zu holen.
Varianten:
Delphi-Quellcode:
((c and 1))
(((c shr 3) and 1))
((c and 1) or ((c shr 3) and 1))

cyberblast 27. Sep 2005 17:37

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.
Seite 3 von 3     123   

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