The BITMAPINFOHEADER structure contains information about the dimensions and color format of a Windows 3.0 device-independent bitmap.
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
DWORD biWidth;
DWORD biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
DWORD biXPelsPerMeter;
DWORD biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
The BITMAPINFOHEADER structure has the following fields:
Field | Description |
biSize | Specifies the number of bytes required by the BITMAPINFOHEADER structure. | ||
biWidth | Specifies the width of the bitmap in pixels. | ||
biHeight | Specifies the height of the bitmap in pixels. | ||
biPlanes | Specifies the number of planes for the target device and must be set to 1. | ||
biBitCount | Specifies the number of bits per pixel. This value must be 1, 4, 8, or 24. | ||
biCompression | Specifies the type of compression for a compressed bitmap. It can be one of the following values:. | ||
Value | Meaning | ||
BI_RGB | Specifies that the bitmap is not compressed. | ||
BI_RLE8 | Specifies a run-length encoded format for bitmaps with 8 bits per pixel. The compression format is a two-byte format consisting of a count byte followed by a byte containing a color index. See the following “Comments” section for more information. | ||
Field | Description |
Value | Meaning | ||
BI_RLE4 | Specifies a run-length encoded 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 indexes. See the following “Comments” section for more information. | ||
biSizeImage | Specifies the size in bytes of the image. | ||
biXPelsPerMeter | Specifies the horizontal resolution in pixels per meter of the target device for the bitmap. An application can use this value to select a bitmap from a resource group that best matches the characteristics of the current device. | ||
biYPelsPerMeter | Specifies the vertical resolution in pixels per meter of the target device for the bitmap. | ||
biClrUsed | Specifies the number of color indexes in the color table actually used by the bitmap. If this value is 0, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount field. See the description of the BITMAPINFO data structure earlier in this chapter for more information on the maximum sizes of the color table. | ||
If biClrUsed is nonzero, then the biClrUsed field specifies the actual number of colors which the graphics engine or device driver will access if the biBitCount field is less than 24. If the biBitCount field is set to 24, the biClrUsed field specifies the size of the reference color table used to optimize performance of Windows color palettes. | |||
If the bitmap is a “packed” bitmap (that is, a bitmap in which the bitmap array immediately follows the BITMAPFINO header and which is referenced by a single pointer), the biClrUsed field must be set to 0 or to the actual size of the color table. | |||
biClrImportant | Specifies the number of color indexes that are considered important for displaying the bitmap. If this value is 0, then all colors are important. |
The BITMAPINFO data structure combines the BITMAPINFOHEADER structure and a color table to provide a complete definition of the dimensions and colors of a Windows 3.0 device-independent bitmap. See the description of the BITMAPINFO data structure for more information about specifying a Windows 3.0 device-independent bitmap.
An application should use the information stored in the biSize field to locate the color table in a BITMAPINFO data structure with a method such as the following:
pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo -> biSize))
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. The following paragraphs describe these formats.
When the biCompression field is set to BI_RLE8, the bitmap is compressed using a run-length encoding format for an 8-bit bitmap. This format may be compressed in either of two modes:
Encoded
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:
Second Byte Of Escape |
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 signalled by the first byte set to zero and the second byte set to a value between 03H and FFH. 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 word 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 field is set to BI_RLE4, the bitmap is compressed using a run-length encoding 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 indexes in the second byte. The second byte contains two color indexes, one in its high-order nibble (that is, its low-order four 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 indexes that follow, and subsequent bytes contain color indexes 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