Device-Independent Bitmaps

Eine geräteunabhängige Bitmap (DIB) enthält eine Farbtabelle. Eine Farbtabelle beschreibt, wie Pixelwerte RGB-Farbwerten entsprechen, die Farben beschreiben, die durch Ausgeben von Licht erzeugt werden. Daher kann ein DIB auf jedem Gerät das richtige Farbschema erzielen. Ein DIB enthält die folgenden Farb- und Dimensionsinformationen:

  • Das Farbformat des Geräts, auf dem das rechteckige Bild erstellt wurde.
  • Die Auflösung des Geräts, auf dem das rechteckige Bild erstellt wurde.
  • Die Palette für das Gerät, auf dem das Image erstellt wurde.
  • Ein Array von Bits, die rot,grün, blau (RGB)-Triplets Pixeln im rechteckigen Bild zugeordnet werden.
  • Ein Datenkomprimierungsbezeichner, der das Datenkomprimierungsschema (falls vorhanden) angibt, mit dem die Größe des Arrays von Bits reduziert wird.

Die Farb- und Dimensionsinformationen werden in einer BITMAPINFO-Struktur gespeichert, die aus einer BITMAPINFOHEADER-Struktur gefolgt von zwei oder mehr RGBQUAD-Strukturen besteht. Die BITMAPINFOHEADER-Struktur gibt die Abmessungen des Pixelrechtecks an, beschreibt die Farbtechnologie des Geräts und identifiziert die Komprimierungsschemas, mit denen die Größe der Bitmap reduziert wird. Die RGBQUAD-Strukturen identifizieren die Farben, die im Pixelrechteck angezeigt werden.

Es gibt zwei Varianten von DIBs:

  • Ein DIB von unten nach oben, in dem sich der Ursprung in der unteren linken Ecke befindet.
  • Ein DIB von oben nach unten, in dem sich der Ursprung in der oberen linken Ecke befindet.

Wenn die Höhe eines DIB, wie durch das Height-Element der Bitmapinformationsheaderstruktur angegeben, ein positiver Wert ist, handelt es sich um einen DIB von unten nach oben. Wenn die Höhe ein negativer Wert ist, handelt es sich um ein DIB von oben nach unten. DiBs von oben nach unten können nicht komprimiert werden.

Das Farbformat wird als Anzahl von Farbebenen und Farbbits angegeben. Die Anzahl der Farbebenen ist immer 1. Die Anzahl der Farbbits beträgt 1 für monocolore Bitmaps, 4 für VGA-Bitmaps und 8, 16, 24 oder 32 für Bitmaps auf anderen Farbgeräten. Eine Anwendung ruft die Anzahl der Farbbits ab, die von einer bestimmten Anzeige (oder einem Drucker) verwendet werden, indem die GetDeviceCaps-Funktion aufgerufen wird, wobei BITSPIXEL als zweites Argument angegeben wird.

Die Auflösung eines Anzeigegeräts wird in Pixel pro Meter angegeben. Eine Anwendung kann die horizontale Auflösung für eine Videoanzeige oder einen Drucker mithilfe dieses dreistufigen Prozesses abrufen.

  1. Rufen Sie die GetDeviceCaps-Funktion auf, und geben Sie HORZRES als zweites Argument an.
  2. Rufen Sie GetDeviceCaps ein zweites Mal auf, und geben Sie HORZSIZE als zweites Argument an.
  3. Dividieren Sie den ersten Rückgabewert durch den zweiten Rückgabewert.

Die Anwendung kann die vertikale Auflösung mithilfe desselben dreistufigen Prozesses mit unterschiedlichen Parametern abrufen: VERTRES anstelle von HORZRES und VERTSIZE anstelle von HORZSIZE.

Die Palette wird durch ein Array von RGBQUAD-Strukturen dargestellt, die die Komponenten rot, grün und blau für jede Farbe in der Farbpalette eines Anzeigegeräts angeben. Jeder Farbindex im Palettenarray wird einem bestimmten Pixel im rechteckigen Bereich zugeordnet, der der Bitmap zugeordnet ist. Die Größe dieses Arrays in Bits entspricht der Breite des Rechtecks in Pixel, multipliziert mit der Höhe des Rechtecks, in Pixel, multipliziert mit der Anzahl der Farbbits für das Gerät. Eine Anwendung kann die Größe der Palette des Geräts abrufen, indem sie die GetDeviceCaps-Funktion aufruft und NUMCOLORS als zweites Argument angibt.

Windows unterstützt die Komprimierung des Palettenarrays für 8-bpp- und 4-bpp-DIBs von unten nach oben. Diese Arrays können mithilfe des RLE-Schemas (Run-Length Encoding) komprimiert werden. Das RLE-Schema verwendet 2-Byte-Werte, das erste Byte, das die Anzahl der aufeinanderfolgenden Pixel angibt, die einen Farbindex verwenden, und das zweite Byte, das den Index angibt. Weitere Informationen zur Bitmapkomprimierung finden Sie in der Beschreibung der BITMAPINFOHEADER-, BITMAPFILEHEADER-, BITMAPV4HEADER-und BITMAPV5HEADER-Strukturen.

Eine Anwendung kann ein DIB aus einer DDB erstellen, indem die erforderlichen Strukturen initialisiert und die GetDIBits-Funktion aufgerufen wird. Um zu bestimmen, ob ein Gerät diese Funktion unterstützt, rufen Sie die GetDeviceCaps-Funktion auf, und geben Sie RC _ DI BITMAP als _ RASTERCAPS-Flag an.

Eine Anwendung, die eine Bitmap kopieren muss, kann TransparentBlt verwenden, um alle Pixel in einer Quellbitmap in eine Zielbitmap zu kopieren, mit Ausnahme der Pixel, die der transparenten Farbe entsprechen.

Eine Anwendung kann ein DIB verwenden, um Pixel auf dem Anzeigegerät festzulegen, indem sie die Funktion SetDIBitsToDevice oder StretchDIBits aufruft. Um zu bestimmen, ob ein Gerät die SetDIBitsToDevice-Funktion unterstützt, rufen Sie die GetDeviceCaps-Funktion auf, und geben Sie RC _ DIBTODEV als RASTERCAPS-Flag an. Geben Sie RC _ STRETCHDIB als RASTERCAPS-Flag an, um zu bestimmen, ob das Gerät StretchDIBits unterstützt.

Eine Anwendung, die lediglich ein bereits vorhandenes DIB anzeigen muss, kann die SetDIBitsToDevice-Funktion verwenden. Beispielsweise kann eine Tabellenkalkulationsanwendung vorhandene Diagramme öffnen und mithilfe der SetDIBitsToDevice-Funktion in einem Fenster anzeigen. Um eine Bitmap in einem Fenster wiederholt neu zu zeichnen, sollte die Anwendung jedoch die BitBlt-Funktion verwenden. Beispielsweise würde eine Multimediaanwendung, die animierte Grafiken mit Sound kombiniert, vom Aufrufen der BitBlt-Funktion profitieren, da sie schneller als SetDIBitsToDevice ausgeführt wird.