Solved

BMP files (Content of)

Posted on 1997-05-25
1
360 Views
Last Modified: 2010-04-04
Help I'm trying to find out the structure of .BMP files. I need to know which bytes do what. ie. which are headers, which are picture info which are footers and anything else. I also need to know if it is encrypted or compressed in any way and if so how to decrypt/decompress it.

      Thanx.             
            Andy
0
Comment
Question by:arint
1 Comment
 
LVL 4

Accepted Solution

by:
erajoj earned 100 total points
Comment Utility
This is what I had. Delphi sample code will cost more:

Microsoft Windows Bitmap Information
(c) Microsoft 1990.  All rights reserved.

Information in this document is subject to change without notice and does
not represent a commitment on the part of Microsoft Corporation.

---------------------------------------------------------------------------

BITMAP

Bitmap Data Structure

The BITMAP structure defines the height, width, color format, and bit
values of a logical bitmap.

   typedef struct tagBITMAP {
      short      bmType;
      short      bmWidth;
      short      bmHeight;
      short      bmWidthBytes;
      BYTE       bmPlanes;
      BYTE       bmBitsPixel;
      LPSTR      bmBits;
   } BITMAP;

The BITMAP structure has the following fields:

Field         Description
-----         -----------

bmType        Specifies the bitmap type. For logical bitmaps, the bmType
              field must be zero.

bmWidth       Specifies the width of the bitmap (in pixels). The width must
              be greater than zero.

bmHeight      Specifies the height of the bitmap (in raster lines). The
              height must be greater than zero.

bmWidthBytes  Specifies the number of bytes in each raster line. This value
              must be an even number since the graphics device interface
              (GDI) assumes that the bit values of a bitmap form an array
              of integer (two-byte) values. In other words, bmWidthBytes x
              8 must be the next multiple of 16 greater than or equal to
              the bmWidth field.

bmPlanes      Points to the number of color planes in the bitmap.

bmBitsPixel   Points to the number of adjacent color bits on each plane
              needed to define a pixel.

bmBits        Points to the location of the bit values for the bitmap. The
              bmBits field must be a long pointer to an array of character
              (one-byte) values.

Comments

The currently used bitmap formats are monochrome and color. The monochrome
bitmap uses a one-bit, one-plane format. Each scan is a multiple of 16 bits.

Scans are organized as follows for a monochrome bitmap of height n:

   Scan 0
   Scan 1
   .
   .
   .
   Scan n-2
   Scan n-1

The pixels on a monochrome device are either black or white. If the
corresponding bit in the bitmap is 1, the pixel is turned on (white); if
the corresponding bit in the bitmap is zero, the pixel is turned off
(black).

All Windows 3.0 devices that have the RC_BITBLT bit set in the device
capabilities support bitmaps.

Each device has its own unique color format. In order to transfer a bitmap
from one device to another, use the Windows 3.0 SDK functions GetDIBits and
SetDIBits.

---------------------------------------------------------------------------

BITMAPCOREHEADER  [3.0]

Device-Independent Bitmap Format Information

The BITMAPCOREHEADER structure contains information about the dimensions
and color format of a device-independent bitmap that is compatible with
Microsoft OS/2 Presentation Manager versions 1.1 and 1.2 bitmaps.

   typedef struct tagBITMAPCOREHEADER {
           DWORD   bcSize;
           WORD    bcWidth;
           WORD    bcHeight;
           WORD    bcPlanes;
           WORD    bcBitCount;
   } BITMAPCOREHEADER;

The BITMAPCOREHEADER structure has the following fields:

Field       Description
-----       -----------

bcSize      Specifies the number of bytes required by the BITMAPCOREHEADER
            structure.

bcWidth     Specifies the width of the bitmap in pixels.

bcHeight    Specifies the height of the bitmap in pixels.

bcPlanes    Specifies the number of planes for the target device and must
            be set to 1.

bcBitCount  Specifies the number of bits per pixel. This value must be
            1, 4, 8, or 24.

Comments

The BITMAPCOREINFO data structure combines the BITMAPCOREHEADER structure
and a color table to provide a complete definition of the dimensions and
colors of a device-independent bitmap. See the description of the
BITMAPCOREINFO data structure for more information about specifying a
device-independent bitmap.

An application should use the information stored in the bcSize field to
locate the color table in a BITMAPCOREINFO data structure with a method
such as the following:

   pColor = ((LPSTR) pBitmapCoreInfo + (WORD) (pBitmapCoreInfo -> bcSize))

---------------------------------------------------------------------------

BITMAPCOREINFO  [3.0]

Device-Indpendent Bitmap Information

The BITMAPCOREINFO structure fully defines the dimensions and color
information for a device-independent bitmap that is compatible with
Microsoft OS/2 Presentation Manager versions 1.1 and 1.2 bitmaps.

   typedef struct _BITMAPCOREINFO {
           BITMAPCOREHEADER  bmciHeader;
           RGBTRIPLE         bmciColors[];
   } BITMAPCOREINFO;

The BITMAPCOREINFO structure contains the following fields:

Field       Description
-----       -----------

bmciHeader  Specifies a BITMAPCOREHEADER data structure that contains
            information about the dimensions and color format of a device-
            independent bitmap.

bmciColors  Specifies an array of RGBTRIPLE data structures that define the
            colors in the bitmap.  

Comments

An OS/2 Presentation Manager device-independent bitmap consists of two
distinct parts:  a BITMAPCOREINFO data structure that describes the
dimensions and colors of the bitmap, and an array of bytes which define the
pixels of the bitmap. The bits in the array are packed together, but each
scan line must be zero-padded to end on a LONG boundary.

Segment boundaries can appear anywhere in the bitmap, however. The origin
of the bitmap is the lower-left corner.

The bcBitCount field of the BITMAPCOREHEADER structure determines the
number of bits which define each pixel and the maximum number of colors in
the bitmap. This field may be set to any of the following values:

Value  Meaning
-----  -------

1      The bitmap is monochrome, and the bmciColors field must contain two
       entries. Each bit in the bitmap array represents a pixel. If the bit
       is clear, the pixel is displayed with the color of the first entry
       in the bmciColors table; if the bit is set, the pixel has the color
       of the second entry in the table.

4      The bitmap has a maximum of 16 colors, and the bmciColors field
       contains 16 entries. Each pixel in the bitmap is represented by a
       four-bit index into the color table.  For example, if the first byte
       in the bitmap is 0x1F,  then the byte represents two pixels. The
       first pixel contains the color in the second table entry, and the
       second pixel contains the color in the 16th table entry.

8      The bitmap has a maximum of 256 colors, and the bmciColors field
       contains 256 entries. In this case, each byte in the array
       represents a single pixel.

24    The bitmap has a maximum of 2^24 colors. The bmciColors field is
      NULL, and each three bytes in the bitmap array represents the
      relative intensities of red, green, and blue, respectively, of a
      pixel.

The colors in the bmciColors table should appear in order of importance.

Alternatively, for functions that use device-independent bitmaps, the
bmciColors field can be an array of 16-bit unsigned integers that specify
an index into the currently realized logical palette instead of explicit
RGB values. In this case, an application using the bitmap must call device
independent bitmap functions with the wUsage parameter set to
DIB_PAL_COLORS.

Note:

The bmciColors field should not contain palette indexes if the bitmap is to
be stored in a file or transferred to another application. Unless the
application uses the bitmap exclusively and under its complete control, the
bitmap color table should contain explicit RGB values.

---------------------------------------------------------------------------

BITMAPFILEHEADER  [3.0]

Bitmap File Information

The BITMAPFILEHEADER data structure contains information about the type,
size, and layout of a device-independent bitmap (DIB) file.

   typedef struct tagBITMAPFILEHEADER {
           WORD    bfType;
           DWORD   bfSize;
           WORD    bfReserved1;
           WORD    bfReserved2;
           DWORD   bfOffBits;
   } BITMAPFILEHEADER;

The BITMAPFILEHEADER data structure contains the following fields:

Field        Description
-----        -----------

bfType       Specifies the type of file. It must be BM.

bfSize       Specifies the size in DWORDs of the file.

bfReserved1  Is reserved and must be set to zero.

bfReserved2  Is reserved and must be set to zero.

bfOffBits    Specifies in bytes the offset from the BITMAPFILEHEADER of the
             actual bitmap in the file.

Comments

A BITMAPINFO or BITMAPCOREINFO data structure immediately follows the
BITMAPFILEHEADER structure in the DIB file.

---------------------------------------------------------------------------

BITMAPINFO  [3.0]

Device-Indpendent Bitmap Information

The BITMAPINFO structure fully defines the dimensions and color information
for a Windows 3.0 device-independent bitmap.

   typedef struct tagBITMAPINFO {
      BITMAPINFOHEADER    bmiHeader;
      RGBQUAD             bmiColors[1];
   } BITMAPINFO;

The BITMAPINFO structure contains the following fields:

Field      Description
-----      -----------

bmiHeader  Specifies a BITMAPINFOHEADER data structure that contains
           information about the dimensions and color format of a device-
           independent bitmap.

bmiColors  Specifies an array of RGBQUAD data structures that define the
           colors in the bitmap.  

Comments

A Windows 3.0 device-independent bitmap consists of two distinct parts:
a BITMAPINFO data structure that describes the dimensions and colors of the
bitmap, and an array of bytes that define the pixels of the bitmap. The
bits in the array are packed together, but each scan line must be zero-
padded to end on a LONG boundary. Segment boundaries can appear anywhere in
the bitmap, however. The origin of the bitmap is the lower-left corner.

The biBitCount field of the BITMAPINFOHEADER structure determines the
number of bits which define each pixel and the maximum number of colors in
the bitmap. This field may be set to any of the following values:

Value  Meaning
-----  -------

1      The bitmap is monochrome, and the bmciColors field must contain two
       entries. Each bit in the bitmap array represents a pixel. If the bit
       is clear, the pixel is displayed with the color of the first entry
       in the bmciColors table; if the bit is set, the pixel has the color
       of the second entry in the table.

4      The bitmap has a maximum of 16 colors, and the bmciColors field
       contains 16 entries. Each pixel in the bitmap is represented by a
       four-bit index into the color table.  For example, if the first byte
       in the bitmap is 0x1F,  then the byte represents two pixels. The
       first pixel contains the color in the second table entry, and the
       second pixel contains the color in the 16th table entry.

8      The bitmap has a maximum of 256 colors, and the bmciColors field
       contains 256 entries. In this case, each byte in the array
       represents a single pixel.

24     The bitmap has a maximum of 2^24 colors. The bmciColors field is
       NULL, and each three bytes in the bitmap array represents the
       relative intensities of red, green, and blue, respectively, of a
       pixel.

The biClrUsed field of the BITMAPINFOHEADER structure specifies the number
of color indexes in the color table actually used by the bitmap. If the
biClrUsed field is set to 0, the bitmap uses the maximum number of colors
corresponding to the value of the biBitCount field.

The colors in the bmiColors table should appear in order of importance.

Alternatively, for functions that use device-independent bitmaps, the
bmiColors field can be an array of 16-bit unsigned integers that specify an
index into the currently realized logical palette instead of explicit RGB
values. In this case, an application using the bitmap must call device-
independent bitmap functions with the wUsage parameter set to
DIB_PAL_COLORS.

Note:

The bmiColors field should not contain palette indices if the bitmap is to
be stored in a file or transferred to another application. Unless the
application uses the bitmap exclusively and under its complete control, the
bitmap color table should contain explicit RGB values.

---------------------------------------------------------------------------

BITMAPINFOHEADER  [3.0]

Device-Independent Bitmap Format Information

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.
                 (= 0L)

                 BI_RLE8  Specifies a run-length encoded format for
                 (= 1L)   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.

                 BI_RLE4  Specifies a run-length encoded format for
                 (= 2L)   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 BITMAPINFO
                 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.

Comments

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
z  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

---------------------------------------------------------------------------

RGBQUAD  [3.0]

RGB Color Structure

The RGBQUAD data structure describes a color consisting of relative
intensities of red, green, and blue. The bmiColors field of the BITMAPINFO
data structure consists of an array of RGBQUAD data structures.

   typedef struct tagRGBQUAD {
      BYTE    rgbBlue;
      BYTE    rgbGreen;
      BYTE    rgbRed;
      BYTE    rgbReserved;
   } RGBQUAD;

The RGBQUAD structure contains the following fields:

Field        Description
-----        -----------

rgbBlue      Specifies the intensity of blue in the color.

rgbGreen     Specifies the intensity of green in the color.

rgbRed       Specifies the intensity of red in the color.

rgbReserved  Is not used and must be set to zero.

---------------------------------------------------------------------------

RGBTRIPLE  [3.0]

RGB Color Structure

The RGBTRIPLE data structure describes a color consisting of relative
intensities of red, green, and blue. The bmciColors field of the
BITMAPCOREINFO data structure consists of an array of RGBTRIPLE data
structures.

   typedef struct tagRGBTRIPLE {
           BYTE    rgbtBlue;
           BYTE    rgbtGreen;
           BYTE    rgbtRed;
   } RGBTRIPLE;

The RGBTRIPLE structure contains the following fields:

Field      Description
-----      -----------

rgbtBlue   Specifies the intensity of blue in the color.

rgbtGreen  Specifies the intensity of green in the color.

rgbtRed    Specifies the intensity of red in the color.

---------------------------------------------------------------------------

/// John
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now