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 |
*/
|