Entwickler-Ecke

Multimedia / Grafik - RGB565 Daten mit Hilfe von GetDIBIts auslesen


Bergmann89 - Di 03.07.12 15:18
Titel: RGB565 Daten mit Hilfe von GetDIBIts auslesen
Hey Leute,

ich versuch grad verzweifelt die Daten einer TBitmap im RGB565-Format auszulesen. Folgender Code kommt dabei zum Einsatz:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
  FillChar (bInfo, SizeOf(bInfo), 0);
  with bInfo.bmiHeader do
  begin
      biSize := SizeOf(bInfo.bmiHeader);
      biWidth := bmp.Width;
      biHeight := -bmp.Height;
      biPlanes := 1;
      biBitCount := 16;
      biCompression := BI_BITFIELDS;
  end;
  with bInfo.bmiColors[0do begin
    rgbRed   := $F800//1111 1000 0000 0000
    rgbGreen := $07E0//0000 0111 1110 0000
    rgbBlue  := $001F//0000 0000 0001 1111
  end;
  buffer := GetMem(bmp.Width * bmp.Height * 4);
  try
  if GetDIBits(bmp.Canvas.Handle, bmp.Handle, 0, bmp.Height, buffer, bInfo, DIB_RGB_COLORS) = 0 then
    raise Exception.Create(format('unable to read bitmap data. error code: %d', [GetLastError]));

  //do something with the data

  finally
    Freemem(buffer);
  end;

So bekomm ich die Daten im RGB555 Format, obwohl ich ja die Bitmaske angegeben hab. In der Doku steht das es eig. so gehen müsste und ich hab auch bei google nix zu dem Problem gefunden. In jedem Thread den ich gefunden hab scheint das so zu gehen, wie es soll. Nur bei mir nich :/ Wär super, wenn ihr mir da weiter helfen könntet.

MfG & Thx Bergmann.


Martok - Di 03.07.12 15:49

Ich habs nicht nachgerechnet, aber laut dem Kollegen von VirtualDub [http://www.virtualdub.org/blog/pivot/entry.php?id=177] ist deine G-Maske falsch.
Und ich sag ja (gestern in Skype), ich würd's selber umrechnen, da weiß ich wenigstens dass es stimmt :P

EDIT: der erste Comment da tut sogar genau das was du auch tun willst.


Bergmann89 - Di 03.07.12 16:42

Hey,

die G-Maske war n Typo, jetz is sie richtig^^ Ich weiß das du mir das gesagt hast, aber ich will es trotzdem mit den GDI Funktionen machen, weil ich denke das dort das Blendending un der ganze Kram über die MMX Befehle laufen, und die sollten schneller sein, als direkt in Software.

Der 2. Kommentar is intressant, aber dafür brauch ich auch erstma nen AVI-Stream, oder liegen bei dem Pointer nur die Rohdaten?

Der 3. Kommentar is auch intressant. Er mein, dass es nich geht, weil die gespeicherte Größe am Anfang des Records falsch ist. Also hab ich mal ein BitmapV4Header gebaut, aber damit gehts trotzdem nicht :(

MfG Bergmann.