typedef struct tagBITMAPINFOHEADER {
DWORD biSize; // size of structure, in bytes
DWORD biWidth; // bitmap width, in pixels
DWORD biHeight; // bitmap height, in pixels
WORD biPlanes; // see below
WORD biBitCount; // see below
DWORD biCompression; // see below
DWORD biSizeImage; // see below
DWORD biXPelsPerMeter; // see below
DWORD biYPelsPerMeter; // see below
DWORD biClrUsed; // see below
DWORD biClrImportant; // see below
} BITMAPINFOHEADER;
Contains information about the dimensions and color format of a Windows 95 DIB.
BI_RGB | Specifies that the bitmap is not compressed. |
BI_RLE8 | Specifies an RLE format for bitmaps with 8 bits per pixel. The compression format is a 2-byte format consisting of a count byte followed by a byte that contains a color index. |
BI_RLE4 | Specifies an RLE format for bitmaps with 4 bits per pixel. The compression format is a two-byte format consisting of a count byte followed by two word-length color indices. |
BI_BITFIELDS | Specifies that the bitmap is not compressed and that the color table consists of three doubleword color masks that specify the red, green, and blue components, respectively, of each pixel. This is valid when used with 16- and 32-bits-per-pixel bitmaps. |
The BITMAPINFO structure combines the BITMAPINFOHEADER structure and a color table to provide a complete definition of the dimensions and colors of a Windows 3.x DIB. Bitmap-Compression Formats
Windows supports formats for compressing bitmaps that define their colors with 8 bits per pixel and with 4 bits per pixel. Compression reduces the disk and memory storage required for the bitmap.
When the biCompression member is set to BI_RLE8, the bitmap is compressed using an RLE format for an 8-bit bitmap. This format may be compressed in either of two modes: encoded or absolute. Both modes can occur anywhere throughout a single bitmap.
Encoded mode consists of two bytes: the first byte specifies the number of consecutive pixels to be drawn using the color index contained in the second byte. In addition, the first byte of the pair can be set to zero to indicate an escape that denotes an end of line, end of bitmap, or a delta. The interpretation of the escape depends on the value of the second byte of the pair. The following list shows the meaning of the second byte.
Value | Meaning |
---|---|
0 | End of line. |
1 | End of bitmap. |
2 | Delta. The two bytes following the escape contain unsigned values indicating the horizontal and vertical offset of the next pixel from the current position. |
Absolute mode is specified when the first byte is set to zero and the second byte set to a value between 03H and 0FFH. In absolute mode, the second byte represents the number of bytes which follow, each of which contains the color index of a single pixel. When the second byte is set to 2 or less, the escape has the same meaning as in encoded mode. In absolute mode, each run must be aligned on a 16-bit boundary.
The following example shows the hexadecimal values of an 8-bit compressed bitmap:
03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01
02 78 00 00 09 1E 00 01
This bitmap would expand as follows (two-digit values represent a color index for a single pixel):
04 04 04
06 06 06 06 06
45 56 67
78 78
move current position 5 right and 1 down
78 78
end of line
1E 1E 1E 1E 1E 1E 1E 1E 1E
end of RLE bitmap
When the biCompression member is set to BI_RLE4, the bitmap is compressed using a RLE format for a 4-bit bitmap, which also uses encoded and absolute modes. In encoded mode, the first byte of the pair contains the number of pixels to be drawn using the color indices in the second byte. The second byte contains two color indices, one in its high-order nibble (that is, its low-order 4 bits) and one in its low-order nibble. The first of the pixels is drawn using the color specified by the high-order nibble, the second is drawn using the color in the low-order nibble, the third is drawn with the color in the high-order nibble, and so on, until all the pixels specified by the first byte have been drawn.
In absolute mode, the first byte contains zero, the second byte contains the number of color indices that follow, and subsequent bytes contain color indices in their high- and low-order nibbles, one color index for each pixel. In absolute mode, each run must be aligned on a word boundary. The end-of-line, end-of-bitmap, and delta escapes also apply to BI_RLE4.
The following example shows the hexadecimal values of a 4-bit compressed bitmap:
03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01
04 78 00 00 09 1E 00 01
This bitmap would expand as follows (single-digit values represent a color index for a single pixel):
0 4 0
0 6 0 6 0
4 5 5 6 6 7
7 8 7 8
move current position 5 right and 1 down
7 8 7 8
end of line
1 E 1 E 1 E 1 E 1
end of RLE bitmap
BITMAPINFO