1 | #ifndef BMP_H
|
2 | #define BMP_H
|
3 |
|
4 | #include <stdint.h>
|
5 |
|
6 | typedef struct
|
7 | {
|
8 | char bfType[2]; // 19778 must always be set to 'BM' to declare that this is a .bmp-file.
|
9 | uint32_t bfSize; // the size of the file in bytes.
|
10 | uint16_t bfReserved1; // must always be set to zero.
|
11 | uint16_t bfReserved2; // must always be set to zero.
|
12 | uint32_t bfOffBits; // 1078 offset from the beginning of the file to the bitmap data.
|
13 | } __attribute__ ((__packed__)) BMPFileHeader;
|
14 |
|
15 | typedef struct
|
16 | {
|
17 | uint32_t biSize; // 40 size of the BITMAPINFOHEADER structure, in bytes.
|
18 | uint32_t biWidth; // width of the image, in pixels.
|
19 | uint32_t biHeight; // height of the image, in pixels.
|
20 | uint16_t biPlanes; // 1 planes of the target device, must be set to zero.
|
21 | uint16_t biBitCount; // 8 bits per pixel.
|
22 | uint32_t biCompression; // 0 the type of compression, usually set to zero (no compression).
|
23 | uint32_t biSizeImage; // 0 the size of the image data, in bytes. If there is no compression, it is valid to set this member to zero.
|
24 | uint32_t biXPelsPerMeter; // 0 usually set to zero.
|
25 | uint32_t biYPelsPerMeter; // 0 usually set to zero.
|
26 | uint32_t biClrUsed; // 0 number of colors in the bitmap, if zero, the number of colors is calculated using biBitCount
|
27 | uint32_t biClrImportant; // 0 number of color that are 'important' for the bitmap, if zero, all colors are important.
|
28 | } __attribute__ ((__packed__)) BMPInfoHeader;
|
29 |
|
30 | typedef struct
|
31 | {
|
32 | uint8_t blue;
|
33 | uint8_t green;
|
34 | uint8_t red;
|
35 | uint8_t Reserved;
|
36 | } __attribute__ ((__packed__)) RGBQUAD;
|
37 |
|
38 | typedef struct
|
39 | {
|
40 | BMPFileHeader bmfh;
|
41 | BMPInfoHeader bmih;
|
42 | RGBQUAD *colors;
|
43 | uint8_t *data;
|
44 | int rowlen;
|
45 | } BMP;
|
46 |
|
47 | #endif /* BMP_H */
|
48 |
|
49 | /*
|
50 |
|
51 | The .bmp file format
|
52 |
|
53 | Introduction:
|
54 | The .bmp file format (sometimes also saved as .dib) is the standard
|
55 | for a Windows 3.0 or later DIB (device independent bitmap) file. It may
|
56 | use compression (though I never came across a compressed .bmp-file)
|
57 | and is (by itself) not capable of storing animation. However, you can
|
58 | animate a bitmap using different methods but you have to write the
|
59 | code which performs the animation. There are different ways to
|
60 | compress a .bmp-file, but I won't explain them here because they are
|
61 | so rarely used. The image data itself can either contain pointers to
|
62 | entries in a color table or literal RGB values (this is explained
|
63 | later).
|
64 |
|
65 | Basic structure:
|
66 | A .bmp file contains of the following data structures:
|
67 |
|
68 | BITMAPFILEHEADER bmfh;
|
69 | BITMAPINFOHEADER bmih;
|
70 | RGBQUAD aColors[];
|
71 | BYTE aBitmapBits[];
|
72 |
|
73 | bmfh contains some information about the bitmap file (about the file,
|
74 | not about the bitmap itself). bmih contains information about the
|
75 | bitmap such as size, colors,... The aColors array contains a color
|
76 | table. The rest is the image data, which format is specified by the
|
77 | bmih structure.
|
78 |
|
79 | Exact structure:
|
80 | The following tables give exact information about the data structures
|
81 | and also contain the settings for a bitmap with the following
|
82 | dimensions: size 100x100, 256 colors, no compression. The start-value
|
83 | is the position of the byte in the file at which the explained data
|
84 | element of the structure starts, the size-value contains the nuber of
|
85 | bytes used by this data element, the name-value is the name assigned
|
86 | to this data element by the Microsoft API documentation. Stdvalue
|
87 | stands for standard value. There actually is no such a thing as a
|
88 | standard value but this is the value Paint assigns to the data element
|
89 | if using the bitmap dimensions specified above (100x100x256). The
|
90 | meaning-column gives a short explanation of the purpose of this data
|
91 | element.
|
92 |
|
93 | The BITMAPFILEHEADER:
|
94 | start size name stdvalue purpose
|
95 | 1 2 bfType 19778 must always be set to 'BM' to declare that this is a .bmp-file.
|
96 | 3 4 bfSize ?? specifies the size of the file in bytes.
|
97 | 7 2 bfReserved1 0 must always be set to zero.
|
98 | 9 2 bfReserved2 0 must always be set to zero.
|
99 | 11 4 bfOffBits 1078 specifies the offset from the beginning of the file to the bitmap data.
|
100 |
|
101 | The BITMAPINFOHEADER:
|
102 | start size name stdvalue purpose
|
103 | 15 4 biSize 40 specifies the size of the BITMAPINFOHEADER structure, in bytes.
|
104 | 19 4 biWidth 100 specifies the width of the image, in pixels.
|
105 | 23 4 biHeight 100 specifies the height of the image, in pixels.
|
106 | 27 2 biPlanes 1 specifies the number of planes of the target device, must be set to zero.
|
107 | 29 2 biBitCount 8 specifies the number of bits per pixel.
|
108 | 31 4 biCompression 0 Specifies the type of compression, usually set to zero (no compression).
|
109 | 35 4 biSizeImage 0 specifies the size of the image data, in bytes. If there is no compression, it is valid to set this member to zero.
|
110 | 39 4 biXPelsPerMeter 0 specifies the the horizontal pixels per meter on the designated targer device, usually set to zero.
|
111 | 43 4 biYPelsPerMeter 0 specifies the the vertical pixels per meter on the designated targer device, usually set to zero.
|
112 | 47 4 biClrUsed 0 specifies the number of colors used in the bitmap, if set to zero the number of colors is calculated using the biBitCount member.
|
113 | 51 4 biClrImportant 0 specifies the number of color that are 'important' for the bitmap, if set to zero, all colors are important.
|
114 |
|
115 | Note that biBitCount actually specifies the color resolution of the
|
116 | bitmap. The possible values are: 1 (black/white); 4 (16 colors); 8
|
117 | (256 colors); 24 (16.7 million colors). The biBitCount data element
|
118 | also decides if there is a color table in the file and how it looks
|
119 | like. In 1-bit mode the color table has to contain 2 entries (usually
|
120 | white and black). If a bit in the image data is clear, it points to
|
121 | the first palette entry. If the bit is set, it points to the
|
122 | second.
|
123 |
|
124 | In 4-bit mode the color table must contain 16 colors. Every
|
125 | byte in the image data represents two pixels. The byte is split into
|
126 | the higher 4 bits and the lower 4 bits and each value of them points
|
127 | to a palette entry. There are also standard colors for 16 colors mode
|
128 | (16 out of Windows 20 reserved colors (without the entries 8, 9, 246,
|
129 | 247)). Note that you do not need to use this standard colors if the
|
130 | bitmap is to be displayed on a screen which support 256 colors or
|
131 | more, however (nearly) every 4-bit image uses this standard colors.
|
132 |
|
133 | In 8-bit mode every byte represents a pixel. The value points to an entry
|
134 | in the color table which contains 256 entries (for details see
|
135 | Palettes in Windows.
|
136 |
|
137 | In 24-bit mode three bytes represent one
|
138 | pixel. The first byte represents the red part, the second the green
|
139 | and the third the blue part. There is no need for a palette because
|
140 | every pixel contains a literal RGB-value, so the palette is omitted.
|
141 |
|
142 |
|
143 | The RGBQUAD array:
|
144 | The following table shows a single RGBQUAD structure:
|
145 | start size name stdvalue purpose
|
146 | 1 1 rgbBlue - specifies the blue part of the color.
|
147 | 2 1 rgbGreen - specifies the green part of the color.
|
148 | 3 1 rgbRed - specifies the red part of the color.
|
149 | 4 1 rgbReserved - must always be set to zero.
|
150 |
|
151 | Note that the term palette does not refer to a RGBQUAD array, which is
|
152 | called color table instead. Also note that, in a color table
|
153 | (RGBQUAD), the specification for a color starts with the blue byte. In
|
154 | a palette a color always starts with the red byte. There is no simple
|
155 | way to map the whole color table into a LOGPALETTE structure, which
|
156 | you will need to display the bitmap. You will have to write a function
|
157 | that copies byte after byte.
|
158 |
|
159 |
|
160 | The pixel data:
|
161 | It depens on the BITMAPINFOHEADER structure how the pixel data is to
|
162 | be interpreted (see above).
|
163 | It is important to know that the rows of a DIB are stored upside
|
164 | down. That means that the uppest row which appears on the screen
|
165 | actually is the lowest row stored in the bitmap, a short example:
|
166 |
|
167 |
|
168 |
|
169 | pixels displayed on the screen pixels stored in .bmp-file
|
170 |
|
171 | You do not need to turn around the rows manually. The API functions
|
172 | which also display the bitmap will do that for you automatically.
|
173 |
|
174 | Another important thing is that the number of bytes in one row must
|
175 | always be adjusted to fit into the border of a multiple of four. You
|
176 | simply append zero bytes until the number of bytes in a row reaches a
|
177 | multiple of four, an example:
|
178 |
|
179 |
|
180 | 6 bytes that represent a row in the bitmap: A0 37 F2 8B 31 C4
|
181 | must be saved as: A0 37 F2 8B 31 C4 00 00
|
182 |
|
183 | to reach the multiple of four which is the next higher after six
|
184 | (eight). If you keep these few rules in mind while working with .bmp
|
185 | files it should be easy for you, to master it.
|
186 | */
|