Device-Independent Bitmaps
Eine geräteunabhängige Bitmap (DIB) enthält eine Farbtabelle. Eine Farbtabelle beschreibt, wie Pixelwerte den RGB-Farbwerten entsprechen, die Farben beschreiben, die durch Lichtausstoß erzeugt werden. So kann ein DIB das richtige Farbschema auf jedem Gerät erreichen. 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, das rote, grüne, blaue ( RGB)- Triplets zu Pixeln im rechteckigen Bild ordnet.
- Ein Datenkomprimierungsbezeichner, der das Datenkomprimierungsschema (falls vorhanden) angibt, das verwendet wird, um die Größe des Arrays von Bits zu reduzieren.
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 Dimensionen des Pixelrechtecks an, beschreibt die Farbtechnologie des Geräts und identifiziert die Komprimierungsschemas, die zum Verringern der Größe der Bitmap verwendet werden. Die RGBQUAD-Strukturen identifizieren die Farben, die im Pixelrechteck angezeigt werden.
Es gibt zwei Arten von DIBs:
- Ein Bottom-Up-DIB, bei dem der Ursprung in der unteren linken Ecke liegt.
- Ein DIB von oben nach unten, bei dem der Ursprung an der linken oberen Ecke liegt.
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 einen DIB von oben nach unten. Top-Down-DIBs 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 ist 1 für monochrome 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 ein bestimmter Bildschirm (oder Drucker) verwendet, indem die GetDeviceCaps-Funktion aufgerufen wird und 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 abrufen, indem Sie diesen dreistufigen Prozess ausführen.
- Rufen Sie die GetDeviceCaps-Funktion auf, und geben Sie HORZRES als zweites Argument an.
- Rufen Sie GetDeviceCaps ein zweites Mal auf, und geben Sie HORZSIZE als zweites Argument an.
- Dividieren Sie den ersten Rückgabewert durch den zweiten Rückgabewert.
Die Anwendung kann die vertikale Auflösung mithilfe desselben dreistufigen Prozesses mit verschiedenen Parametern abrufen: VERTRES anstelle von HORZRES und VERTSIZE anstelle von HORZSIZE.
Die Palette wird durch ein Array von RGBQUAD-Strukturen dargestellt, die die Intensitätskomponenten 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 Pixeln, multipliziert mit der Anzahl der Farbbits für das Gerät. Eine Anwendung kann die Größe der Gerätepalette 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-BOTTOM-UP-DIBs. 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 aufeinanderfolgender Pixel angibt, die einen Farbindex verwenden, und das zweite Byte, das den Index angibt. Weitere Informationen zur Bitmapkomprimierung finden Sie in der Beschreibung der Strukturen BITMAPINFOHEADER, BITMAPFILEHEADER, BITMAPV4HEADER und BITMAPV5HEADER .
Eine Anwendung kann einen DIB aus einer DDB erstellen, indem sie die erforderlichen Strukturen initialisiert und die GetDIBits-Funktion aufruft . Um zu ermitteln, 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 Quell-Bitmap in eine Ziel-Bitmap mit Ausnahme der Pixel zu kopieren, die der transparenten Farbe entsprechen.
Eine Anwendung kann einen DIB verwenden, um Pixel auf dem Anzeigegerät festzulegen, indem sie setDIBitsToDevice oder die StretchDIBits-Funktion aufruft . Um festzustellen, 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 ermitteln, ob das Gerät StretchDIBits unterstützt.
Eine Anwendung, die lediglich einen bereits vorhandenen DIB anzeigen muss, kann die SetDIBitsToDevice-Funktion verwenden. Beispielsweise kann eine Tabellenkalkulationsanwendung vorhandene Diagramme öffnen und mit 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 ausgeführt wird als SetDIBitsToDevice.