Frage

Ich lade einen DIBSection aus einer Datei mit den folgenden Angaben:

HBITMAP bmpIn = (HBITMAP) LoadImage(NULL, _T("c:\\Temp\\Temp.bmp"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);

Empirisch habe ich die folgenden Unterschiede zwischen der geladenen Bitmap und den Bitmaps entdeckt, die ich in der Vergangenheit verwendet habe, aber ich kann keine Dokumentation finden, die besagt, dass es einen Unterschied geben sollte.

  • Die Zeilen sind im Speicher von oben nach unten und nicht von unten nach oben angeordnet. Ich habe überprüft, ob die BMP-Datei selbst von unten nach oben sortiert ist.
  • Die Zeilenauffüllung erfolgt auf ein Vielfaches von 2 Bytes anstatt auf 4.

    Ich habe auch einen dokumentierten Unterschied festgestellt, wenn Sie CreateDIBSection verwenden um einen DIBSection von Grund auf neu zu erstellen.

    • Die vom GetObject zurückgegebenen Werte DIBSECTION.dsHandle und BITMAP.bmBits sind NULL.

      Wo ist die Dokumentation für die ersten beiden Unterschiede und fehlt mir etwas? Dies ist mit Windows 7 möglich, aber ich kann mir nicht vorstellen, dass es für andere Windows-Versionen anders sein würde.

      Bearbeiten: Einige zusätzliche Details. Hier ist ein Hex-Dump von temp.bmp; Es ist ein 7x7-Bild mit einem weißen Streifen auf der rechten Seite und blauen Werten, die entlang der linken Seite inkrementieren (0x10,0x20 usw.) Sie können sehen, dass die unterste Zeile (00,00,70) an erster Stelle steht und dass 3 Byte Auffüllung vorhanden sind.

      00: 42 4d de 00 00 00 00 00 00 00 36 00 00 00 28 00
      10: 00 00 07 00 00 00 07 00 00 00 01 00 18 00 00 00
      20: 00 00 a8 00 00 00 00 00 00 00 00 00 00 00 00 00
      30: 00 00 00 00 00 00 70 00 00 00 00 00 00 00 00 00
      40: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 60 00
      50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      60: ff ff ff 00 00 00 50 00 00 00 00 00 00 00 00 00
      70: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 40 00
      80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      90: ff ff ff 00 00 00 30 00 00 00 00 00 00 00 00 00
      a0: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 20 00
      b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      c0: ff ff ff 00 00 00 10 00 00 00 00 00 00 00 00 00
      d0: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00
      

      Hier ist ein Beispielprogramm zum Lesen der BMP-Datei und zum Ausschreiben des Inhalts. Ich habe die Fehlerprüfung auf Kürze entfernt.

      int _tmain(int argc, _TCHAR* argv[])
      {
         HBITMAP bmpIn = (HBITMAP) LoadImage(NULL, argv[1], IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
         FILE * out = _tfopen(argv[2], _T("wb"));
         DIBSECTION obj = {0};
         GetObject(bmpIn, sizeof(obj), &obj);
         cout << "dsBm.bmHeight = " << obj.dsBm.bmHeight << endl;
         cout << "dsBmih.biHeight = " << obj.dsBmih.biHeight << endl;
         cout << "sizeof(DIBSECTION) = " << sizeof(DIBSECTION) << endl;
         fwrite(&obj, sizeof(DIBSECTION), 1, out);
         int stride = (((obj.dsBmih.biWidth * obj.dsBmih.biBitCount) + 15) / 16) * 2;
         int bytecount = abs(obj.dsBmih.biHeight) * stride;
         vector<BYTE> bits(bytecount);
         GetBitmapBits(bmpIn, bytecount, &bits[0]);
         fwrite(&bits[0], 1, bytecount, out);
         fclose(out);
         return 0;
      }
      

      Und hier ist die Ausgabe des obigen Programms zusammen mit einem Hex-Dump der erzeugten Datei:

      dsBm.bmHeight = 7
      dsBmih.biHeight = 7
      sizeof(DIBSECTION) = 84
      00: 00 00 00 00 07 00 00 00 07 00 00 00 18 00 00 00
      10: 01 00 18 00 00 00 11 00 28 00 00 00 07 00 00 00
      20: 07 00 00 00 01 00 18 00 00 00 00 00 a8 00 00 00
      30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      50: 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00
      60: 00 00 00 00 00 00 ff ff ff 00 20 00 00 00 00 00
      70: 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff 00
      80: 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      90: 00 00 ff ff ff 00 40 00 00 00 00 00 00 00 00 00
      a0: 00 00 00 00 00 00 00 00 ff ff ff 00 50 00 00 00
      b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff
      c0: ff 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00
      d0: 00 00 00 00 ff ff ff 00 70 00 00 00 00 00 00 00
      e0: 00 00 00 00 00 00 00 00 00 00 ff ff ff 00
      

War es hilfreich?

Lösung

Rufen Sie GetDIBits anstelle von GetBitmapBits auf.Die Dokumente für GetBitmapBits ( hier )Geben Sie an, dass dies Daten für eine geräteabhängige Bitmap zurückgibt, während Sie über eine geräteunabhängige Bitmap verfügen.Sie weisen auch darauf hin, dass dieser Aufruf nicht verwendet werden sollte und nur der 16-Bit-Kompatibilität dient.Die Verwendung von GetDIBits sollte also ausreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top