]> git.imager.perl.org - imager.git/blob - fileformatdocs/bmp.txt
add missing va_end() in bmp.c's write_packed()
[imager.git] / fileformatdocs / bmp.txt
1 BITMAPFILEHEADER  [3.0]
2
3 Bitmap File Information
4 The BITMAPFILEHEADER data structure contains information about the type, 
5 size, and layout of a device-independent bitmap (DIB) file.
6
7 typedef struct tagBITMAPFILEHEADER {
8         WORD    bfType;
9         DWORD   bfSize;
10         WORD    bfReserved1;
11         WORD    bfReserved2;
12         DWORD   bfOffBits;
13 } BITMAPFILEHEADER;
14
15 The BITMAPFILEHEADER data structure contains the following fields:
16
17 Field           Description
18 bfType          Specifies the type of file. It must be BM.
19 bfSize          Specifies the size in DWORDs of the file. 
20 bfReserved1     Is reserved and must be set to zero. 
21 bfReserved2     Is reserved and must be set to zero. 
22 bfOffBits       Specifies in bytes the offset from the BITMAPFILEHEADER 
23                 of the actual bitmap in the file. 
24
25 Comments        A BITMAPINFO or BITMAPCOREINFO data structure immediately 
26 follows the BITMAPFILEHEADER structure in the DIB file.
27
28
29 BITMAPINFO  [3.0]
30
31 Device-Indpendent Bitmap Information
32 The BITMAPINFO structure fully defines the dimensions and color 
33 information for a Windows 3.0 device-independent bitmap.
34
35 typedef struct tagBITMAPINFO { 
36    BITMAPINFOHEADER    bmiHeader;
37    RGBQUAD             bmiColors[1];
38 } BITMAPINFO;
39
40 The BITMAPINFO structure contains the following fields:
41
42 Field   Description
43 bmiHeader       Specifies a BITMAPINFOHEADER data structure that 
44                 contains information about the dimensions and color                             format of a device-independent bitmap. 
45 bmiColors       Specifies an array of RGBQUAD data structures that 
46                 define the colors in the bitmap.  
47
48 Comments:       A Windows 3.0 device-independent bitmap consists of two 
49 distinct parts: a BITMAPINFO data structure that describes the dimensions 
50 and colors of the bitmap, and an array of bytes that define the pixels of 
51 the bitmap. The bits in the array are packed together, but each scan line 
52 must be zero-padded to end on a LONG boundary. Segment boundaries can 
53 appear anywhere in the bitmap, however. The origin of the bitmap is the 
54 lower-left corner.
55
56 The biBitCount field of the BITMAPINFOHEADER structure determines the 
57 number of bits which define each pixel and the maximum number of colors 
58 in the bitmap. This field may be set to any of the following values:
59
60 Value   Meaning
61 1       The bitmap is monochrome, and the bmiColors field must 
62         contain two entries. Each bit in the bitmap array represents a 
63         pixel. If the bit is clear, the pixel is displayed with the
64         color of the first entry in the bmiColors table; if the bit is
65         set, the pixel has the color of the second entry in the table.
66 4       The bitmap has a maximum of 16 colors, and the bmiColors 
67         field contains up to 16 entries. Each pixel in the bitmap is 
68         represented by a four-bit index into the color table.
69         For example, if the first byte in the bitmap is 0x1F,  then the 
70         byte represents two pixels. The first pixel contains the color 
71         in the second table entry, and the second pixel contains the 
72         color in the 16th table entry.
73 8       The bitmap has a maximum of 256 colors, and the bmiColors 
74         field contains up to 256 entries. In this case, each byte in the 
75         array represents a single pixel.
76 24      The bitmap has a maximum of 2^24 colors. The bmiColors 
77         field is NULL, and each three bytes in the bitmap array 
78         represents the relative intensities of red, green, and blue, 
79         respectively, of a pixel.
80
81 The biClrUsed field of the BITMAPINFOHEADER structure specifies the number
82 of color indexes in the color table actually used by the bitmap. If the 
83 biClrUsed field is set to 0, the bitmap uses the maximum number of colors 
84 corresponding to the value of the biBitCount field.
85
86 The colors in the bmiColors table should appear in order of importance.
87
88 Alternatively, for functions that use device-independent bitmaps, the 
89 bmiColors field can be an array of 16-bit unsigned integers that specify 
90 an index into the currently realized logical palette instead of explicit 
91 RGB values. In this case, an application using the bitmap must call 
92 device-independent bitmap functions with the wUsage parameter set to 
93 DIB_PAL_COLORS.
94
95 Note:   The bmiColors field should not contain palette indices if the 
96 bitmap is to be stored in a file or transferred to another application. 
97 Unless the application uses the bitmap exclusively and under its complete 
98 control, the bitmap color table should contain explicit RGB values.
99
100 BITMAPINFOHEADER  [3.0]
101
102 Device-Independent Bitmap Format Information
103 The BITMAPINFOHEADER structure contains information about the dimensions 
104 and color format of a Windows 3.0 device-independent bitmap.
105
106 typedef struct tagBITMAPINFOHEADER{
107    DWORD  biSize;
108    DWORD  biWidth;
109    DWORD  biHeight;
110    WORD   biPlanes;
111    WORD   biBitCount
112    DWORD  biCompression;
113    DWORD  biSizeImage;
114    DWORD  biXPelsPerMeter;
115    DWORD  biYPelsPerMeter;
116    DWORD  biClrUsed;
117    DWORD  biClrImportant;
118 } BITMAPINFOHEADER;
119
120 The BITMAPINFOHEADER structure has the following fields:
121
122 Field           Description
123 biSize          Specifies the number of bytes required by the 
124                 BITMAPINFOHEADER structure. 
125 biWidth         Specifies the width of the bitmap in pixels. 
126 biHeight        Specifies the height of the bitmap in pixels. 
127 biPlanes        Specifies the number of planes for the target device and
128                 must be set to 1. 
129 biBitCount      Specifies the number of bits per pixel. This value must 
130                 be 1, 4, 8, or 24. 
131 biCompression   Specifies the type of compression for a compressed      
132                 bitmap. It can be one of the following values:.
133                 Value           Meaning
134                 BI_RGB          Specifies that the bitmap is not 
135                                 compressed.
136                 BI_RLE8         Specifies a run-length encoded format 
137                                 for bitmaps with 8 bits per pixel. The 
138                                 compression format is a two-byte 
139                                 format consisting of a count byte 
140                                 followed by a byte containing a color 
141                                 index. See the following 'Comments' 
142                                 section for more information.
143                 BI_RLE4         Specifies a run-length encoded format 
144                                 for bitmaps with 4 bits per pixel. The 
145                                 compression format is a two-byte 
146                                 format consisting of a count byte 
147                                 followed by two word-length color 
148                                 indexes. See the following 'Comments' 
149                                 section for more information.
150 biSizeImage     Specifies the size in bytes of the image. 
151 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. 
152 biClrUsed       Specifies the number of color indexes in the color table 
153                 actually used by the bitmap. If this value is 0, the    
154                 bitmap uses the maximum number of colors corresponding  
155                 to the value of the biBitCount field. See the           
156                 description of the BITMAPINFO data structure earlier in         
157                 this chapter for more information on the maximum sizes 
158                 of the color table. If biClrUsed is nonzero, then the 
159                 biClrUsed field specifies the actual number of colors 
160                 which the graphics engine or device driver will access 
161                 if the biBitCount field is less than 24. If the         
162                 biBitCount field is set to 24, the biClrUsed field      
163                 specifies the size of the reference color table used to 
164                 optimize performance of Windows color palettes.
165                 If the bitmap is a 'packed' bitmap (that is, a bitmap in 
166                 which the bitmap array immediately follows the  
167                 BITMAPINFO header and which is referenced by a single   
168                 pointer), the biClrUsed field must be set to 0 or to the 
169                 actual size of the color table. 
170 biClrImportant  Specifies the number of color indexes that are considered 
171                 important for displaying the bitmap. If this value is 0,        
172                 then all colors are important. 
173
174 Comments:       The BITMAPINFO data structure combines the 
175 BITMAPINFOHEADER structure and a color table to provide a complete 
176 definition of the dimensions and colors of a Windows 3.0 
177 device-independent bitmap. See the description of the BITMAPINFO data 
178 structure for more information about specifying a Windows 3.0 
179 device-independent bitmap.
180
181 An application should use the information stored in the biSize field to 
182 locate the color table in a BITMAPINFO data structure with a method such 
183 as the following:
184
185 pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo -> biSize))
186
187 Bitmap Compression Formats      Windows supports formats for compressing 
188 bitmaps that define their colors with 8 bits per pixel and with 4 bits 
189 per pixel. Compression reduces the disk and memory storage required for 
190 the bitmap. The following paragraphs describe these formats.
191
192 When the biCompression field is set to BI_RLE8, the bitmap is compressed 
193 using a run-length encoding format for an 8-bit bitmap. This format may 
194 be compressed in either of two modes:
195
196 7       Encoded
197 7       Absolute
198
199
200 Both modes can occur anywhere throughout a single bitmap.
201
202 Encoded mode consists of two bytes:  the first byte specifies the number 
203 of consecutive pixels to be drawn using the color index contained in the 
204 second byte. In addition, the first byte of the pair can be set to zero 
205 to indicate an escape that denotes an end of line, end of bitmap, or a 
206 delta. The interpretation of the escape depends on the value of the 
207 second byte of the pair. The following list shows the meaning of the 
208 second byte:
209
210 Second Byte
211 Of Escape       
212                 Meaning
213 0               End of line.
214 1               End of bitmap.
215 2               Delta. The two bytes following the escape contain
216                 unsigned values indicating the horizontal and vertical
217                 offset of the next pixel from the current position.
218
219 Absolute mode is signalled by the first byte set to zero and the second 
220 byte set to a value between 03H and FFH. In absolute mode, the second 
221 byte represents the number of bytes which follow, each of which contains
222 the color index of a single pixel. When the second byte is set to 2 or 
223 less, the escape has the same meaning as in encoded mode. 
224 In absolute mode, each run must be aligned on a word boundary.
225
226 The following example shows the hexadecimal values of an 8-bit compressed 
227 bitmap:
228
229 03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 
230 02 78 00 00 09 1E 00 01
231
232 This bitmap would expand as follows (two-digit values represent a color 
233 index for a single pixel):
234
235 04 04 04
236 06 06 06 06 06
237 45 56 67
238 78 78
239 move current position 5 right and 1 down
240 78 78
241 end of line
242 1E 1E 1E 1E 1E 1E 1E 1E 1E 
243 end of RLE bitmap
244
245 When the biCompression field is set to BI_RLE4, the bitmap is compressed 
246 using a run-length encoding format for a 4-bit bitmap, which also uses 
247 encoded and absolute modes. In encoded mode, the first byte of the pair 
248 contains the number of pixels to be drawn using the color indexes in the 
249 second byte. The second byte contains two color indexes, one in its 
250 high-order nibble (that is, its low-order four bits) and one in its 
251 low-order nibble. The first of the pixels is drawn using the color 
252 specified by the high-order nibble, the second is drawn using the color 
253 in the low-order nibble, the third is drawn with the color in the 
254 high-order nibble, and so on, until all the pixels specified by the 
255 first byte have been drawn.
256
257 In absolute mode, the first byte contains zero, the second byte contains 
258 the number of color indexes that follow, and subsequent bytes contain 
259 color indexes in their high- and low-order nibbles, one color index for 
260 each pixel. In absolute mode, each run must be aligned on a word boundary.
261 The end-of-line, end-of-bitmap, and delta escapes also apply to BI_RLE4.
262
263 The following example shows the hexadecimal values of a 4-bit compressed 
264 bitmap:
265
266 03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 
267 04 78 00 00 09 1E 00 01
268
269 This bitmap would expand as follows (single-digit values represent a 
270 color index for a single pixel):
271
272 0 4 0
273 0 6 0 6 0 
274 4 5 5 6 6 7
275 7 8 7 8
276 move current position 5 right and 1 down
277 7 8 7 8
278 end of line
279 1 E 1 E 1 E 1 E 1
280 end of RLE bitmap
281
282 RGBQUAD  [3.0]
283
284 RGB Color Structure
285 The RGBQUAD data structure describes a color consisting of relative 
286 intensities of red, green, and blue. The bmiColors field of the 
287 BITMAPINFO data structure consists of an array of RGBQUAD data structures.
288
289 typedef struct tagRGBQUAD {
290    BYTE    rgbBlue;
291    BYTE    rgbGreen;
292    BYTE    rgbRed;
293    BYTE    rgbReserved;
294 } RGBQUAD;
295
296 The RGBQUAD structure contains the following fields:
297
298 Field           Description
299 rgbBlue         Specifies the intensity of blue in the color. 
300 rgbGreen        Specifies the intensity of green in the color. 
301 rgbRed          Specifies the intensity of red in the color. 
302 rgbReserved     Is not used and must be set to zero. 
303
304
305
306 #define BI_RGB      0L
307 #define BI_RLE8     1L
308 #define BI_RLE4     2L
309
310 BITMAPCOREINFO  [3.0]
311
312 Device-Indpendent Bitmap Information
313 The BITMAPCOREINFO structure fully defines the dimensions and color 
314 information for a device-independent bitmap that is compatible with 
315 Microsoft OS/2 Presentation Manager versions 1.1 and 1.2 bitmaps.
316
317 typedef struct _BITMAPCOREINFO {
318         BITMAPCOREHEADER  bmciHeader;
319         RGBTRIPLE         bmciColors[];
320 } BITMAPCOREINFO;
321
322 The BITMAPCOREINFO structure contains the following fields:
323
324 Field   Description
325 bmciHeader      Specifies a BITMAPCOREHEADER data structure that 
326                 contains information about the dimensions and color 
327                 format of a device-independent bitmap. 
328 bmciColors      Specifies an array of RGBTRIPLE data structures that 
329                 define the colors in the bitmap.  
330
331 Comments        An OS/2 Presentation Manager device-independent bitmap 
332 consists of two distinct parts:  a BITMAPCOREINFO data structure that 
333 describes the dimensions and colors of the bitmap, and an array of bytes 
334 which define the pixels of the bitmap. The bits in the array are packed 
335 together, but each scan line must be zero-padded to end on a LONG 
336 boundary. Segment boundaries can appear anywhere in the bitmap, however. 
337 The origin of the bitmap is the lower-left corner.
338
339 The bcBitCount field of the BITMAPCOREHEADER structure determines the 
340 number of bits which define each pixel and the maximum number of colors 
341 in the bitmap. This field may be set to any of the following values:
342
343 Value   Meaning
344 1       The bitmap is monochrome, and the bmciColors field must 
345         contain two entries. Each bit in the bitmap array represents a 
346         pixel. If the bit is clear, the pixel is displayed with the 
347         color of the first entry in the bmciColors table; if the bit is 
348         set, the pixel has the color of the second entry in the table.
349 4       The bitmap has a maximum of 16 colors, and the bmciColors 
350         field contains 16 entries. Each pixel in the bitmap is represented 
351         by a four-bit index into the color table.
352         For example, if the first byte in the bitmap is 0x1F,  then the 
353         byte represents two pixels. The first pixel contains the color in 
354         the second table entry, and the second pixel contains the color 
355         in the 16th table entry.
356 8       The bitmap has a maximum of 256 colors, and the bmciColors 
357         field contains 256 entries. In this case, each byte in the array 
358         represents a single pixel.
359 24      The bitmap has a maximum of 2^24 colors. The bmciColors 
360         field is NULL, and each three bytes in the bitmap array 
361         represents the relative intensities of red, green, and blue, 
362         respectively, of a pixel.
363
364 The colors in the bmciColors table should appear in order of importance.
365
366 Alternatively, for functions that use device-independent bitmaps, the 
367 bmciColors field can be an array of 16-bit unsigned integers that 
368 specify an index into the currently realized logical palette instead of 
369 explicit RGB values. In this case, an application using the bitmap must 
370 call device-independent bitmap functions with the wUsage parameter 
371 set to DIB_PAL_COLORS.
372
373 Note    The bmciColors field should not contain palette indexes if the 
374 bitmap is to be stored in a file or transferred to another application. 
375 Unless the application uses the bitmap exclusively and under its 
376 complete control, the bitmap color table should contain explicit 
377 RGB values.
378
379
380
381 BITMAPCOREHEADER  [3.0]
382
383 Device-Independent Bitmap Format Information
384 The BITMAPCOREHEADER structure contains information about the dimensions 
385 and color format of a device-independent bitmap that is compatible with 
386 Microsoft OS/2 Presentation Manager versions 1.1 and 1.2 bitmaps.
387
388 typedef struct tagBITMAPCOREHEADER {
389         DWORD   bcSize;
390         WORD    bcWidth;
391         WORD    bcHeight;
392         WORD    bcPlanes;
393         WORD    bcBitCount;
394 } BITMAPCOREHEADER;
395
396 The BITMAPCOREHEADER structure has the following fields:
397
398 Field           Description
399 bcSize          Specifies the number of bytes required by the BITMAPCOREHEADER 
400                 structure. 
401 bcWidth         Specifies the width of the bitmap in pixels. 
402 bcHeight        Specifies the height of the bitmap in pixels. 
403 bcPlanes        Specifies the number of planes for the target device and 
404                 must be set to 1. 
405 bcBitCount      Specifies the number of bits per pixel. This value must 
406                 be 1, 4, 8, or 24. 
407
408 Comments        The BITMAPCOREINFO data structure combines the 
409 BITMAPCOREHEADER structure and a color table to provide a complete 
410 definition of the dimensions and colors of a device-independent bitmap. 
411 See the description of the BITMAPCOREINFO data structure for more 
412 information about specifying a device-independent bitmap.
413
414 An application should use the information stored in the bcSize field to 
415 locate the color table in a BITMAPCOREINFO data structure with a method 
416 such as the following:
417
418 pColor = ((LPSTR) pBitmapCoreInfo + (WORD) (pBitmapCoreInfo -> bcSize))
419
420
421
422 RGBTRIPLE  [3.0]
423
424 RGB Color Structure
425 The RGBTRIPLE data structure describes a color consisting of relative 
426 intensities of red, green, and blue. The bmciColors field of the 
427 BITMAPCOREINFO data structure consists of an array of RGBTRIPLE data 
428 structures.
429
430 typedef struct tagRGBTRIPLE {
431         BYTE    rgbtBlue;
432         BYTE    rgbtGreen;
433         BYTE    rgbtRed;
434 } RGBTRIPLE;
435
436 The RGBTRIPLE structure contains the following fields:
437
438 Field           Description
439 rgbtBlue        Specifies the intensity of blue in the color. 
440 rgbtGreen       Specifies the intensity of green in the color. 
441 rgbtRed         Specifies the intensity of red in the color. 
442
443
444
445 -----------------------------------------------------------------------
446
447         Non official comments
448
449 How to distinguish between BITMAPINFO and BITMAPCOREINFO when reading
450 in a BMP file.
451
452 After reading the BITMAPFILEHEADER read the next DWORD from the file. 
453 If it is 12 you are reading a BITMAPCOREHEADER, if it is 40 you are
454 reading a BITMAPINFOHEADER.