Article View: comp.os.ms-windows.programmer.misc
Article #1834DIB/BMP CREATION GUIDE, as requested.
From: Thomas Kinsman
Date: Wed, 23 Dec 1992 21:44
Date: Wed, 23 Dec 1992 21:44
484 lines
13054 bytes
13054 bytes
GUIDE TO CREATION OF DIB IMAGES
Thomas B. Kinsman
Precambrian Electronics
29 Falstaff Rd.
Rochester, NY 14609
thomask@kodak.com
Copyright March 15, 1991
ABSTRACT
The format of images created for use by MS Windows 3.0/3.1
applications is documented in the MS Windows Programmer's
Reference guide. This guide is intended as a clearify some
wording of the specifications, and to put forth a
recommendation among the various alternatives.
Please send updates/corrections/suggestions and revisions to
me. Please thank me for writing this on my own time by
keeping my name with the document. Thank you for your
respect.
This document Copyright, 1991, by Thomas B. Kinsman.
If desired, a PostScript version of this document is
available.
This information is free. You get more than what you pay for.
Don't sue me if I'm wrong.
OVERVIEW
The DIB image file format is intended to be a "Device Independent Bitmap"
file format. (What Microsoft means by "Device Independent" is unclear to
me.) Four pixel resolutions are supported: 1 bit, 4 bit, 8 bit, and 24 bit
pixels.
These images were intended for use on DOS (IBM, or Little-Endian) systems.
If you are creating them on another architecture you will have to byte-
swap all short and long integer values.
By convention, DIB images end in the extension ".BMP". This is because
March 15, 1991
- 2 -
they are a super-set of earlier "bitmap image files". Consequently you
will sometimes hear DIB files referred to as "BMP" files.
Since DIB images files are a super-set, there are three "flavors" of DIB
images:
o DOS DIB images. These are the recommended convention, and the
form which I will describe how to create. They are intended for
applications running under MS Windows /3.0 in a DOS environment.
o OS/2 DIB images. My understanding is that these are the flavor
of DIB images that were used by the Presentation Manager.
o Old-style Bitmap images.
March 15, 1991
- 3 -
DIFFERENCES BETWEEN FLAVORS
The DOS DIB images consist of:
1. A "BITMAPFILEHEADER" file header which identifies the file as a
DIB file. This header also gives the total size of the image
file, and the offset to the image data.
2. A "BITMAPINFOHEADER" image header which specifies the image
attributes.
3. An optional palette of colors used by the image. If it exists,
this may contain 2, 16, or 256 entries. Each entry is a Windows
RGBQUAD structure.
4. The image data itself.
The OS/2 DIB images consist of:
1. The same "BITMAPFILEHEADER" file header which identifies the file
as a DIB file. This header also gives the total size of the
image file, and the offset to the image data.
2. A "BITMAPCOREHEADER" image header which specifies the image
attributes.
3. An optional palette of colors used by the image. Again, if this
exists it may contain 2, 16, or 256 entries. Each entry is a
Windows RGBTRIPLE structure.
4. The image data itself.
The Old Style image bitmap consists of:
1. Either a BITMAPINFOHEADER or a BITMAPCOREHEADER. Which header
type is determined by the first long integer (DWORD) value.
2. An optional color palette. This palette may be composed of
either Windows RGBQUAD structures (if the header was a
BITMAPINFOHEADER) or Windows RGBTRIPLE structures (if the header
was a BITMAPCOREHEADER).
3. The image data itself.
CREATING DIB IMAGE FILES.
Creating a DOS DIB image file consists of several straight forward steps.
The headers need to be created and then written to the file. These header
structures are defined in the MS Windows/3.0 "windows.h" include file.
Palette information needs to be stored for images that are not 24-bit
images. The five general steps are:
1. Filling in the BITMAPFILEHEADER and the BITMAPINFOHEADER
structures the basic image information.
2. If the image is a 1-bit, 4-bit, or an 8-bit image, creating the
color palette of RGBQUADS.
3. Calculating the total file size and putting this information in
March 15, 1991
- 4 -
the "bfSize" field of the BITMAPFILEHEADER.
4. Calculating the offset to the image data from the start of the
file, and putting this in the "bfOffBits" field of the
BITMAPFILEHEADER.
5. Writing to the file the BITMAPFILEHEADER, the BITMAPINFOHEADER,
the color palette, and the image data (in that order).
The following sections describe structures in terms of MicroSoft C type-
defined keywords. The following table describes these keywords for those
not familiar with MicroSoft C.
_______________________________________
| |
| Type-defined keywords in MicroSoft C.|
|______________________________________|
| typedef | meaning |
|_________|____________________________|
| BYTE | unsigned character |
| WORD | two byte unsigned integer |
| DWORD | four byte unsigned integer|
|_________|____________________________|
March 15, 1991
- 5 -
THE BITMAPFILEHEADER
This structure is defined in "windows.h" as:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
The "bfType" field is the two ascii characters 'B' and 'M'. This serves
to identify the file as a DIB image file. On an intel byte ordered
machine (IBM or a compatible), this constant can be formed in C as the
quantity ('M' << 8 | 'B') == 0x4d42 on an intel system.
The "bfSize" field is the total size of the file. For our purposes this
field is equal to: the size of the BITMAPFILEHEADER, plus the size of the
BITMAPINFOHEADER, plus the number of entries in the color palette times
the size of a RGBQUAD, plus the number of bytes of image data. If the
image data is being written out in an uncompressed form, this value can be
calculated ahead of time. Otherwise, this field needs to be filled in
later.
Both the "bfReserved1" and the "bfReserved2" fields are always set to
zero.
The "bfOffBits" field is set to the offset to the start of the image data
from the start of the file. For our purposes, this field should be set
to: the size of the BITMAPFILEHEADER, plus the size of the
BITMAPINFOHEADER, plus the number of entries in the color palette times
the size of a RGBQUAD. This works out because the image data is written
write after the color palette if one exists.
March 15, 1991
- 6 -
THE BITMAPINFOHEADER
This structure is defined in "windows.h" as:
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 "biSize" field is set to the size of the BITMAPINFOHEADER structure
itself. When reading the image file, this value is what is used to
determine that the image contains a BITMAPINFOHEADER and not a
BITMAPCOREHEADER.
The "biWidth" field is the width of the image in image pixels.
The "biHeight" field is the height of the image in image lines.
The "biPlanes" field should always be set to 1. This data is written out
as if there was one color plane.
The "biBitCount" field is the bit-depth of the image. This must be either
1, 4, 8, or 24, depending on the bit-depth of the image data.
The "biCompression" field tells how the image data is compressed if it is
compressed. DIB images support two forms of run-length encoding.
However, I have never seen any images which use it, and don't know yet how
it works. Set this field to zero (long zero, or 0L), to indicate that the
data is not compressed.
All subsequent fields of the BITMAPINFOHEADER structure may be set to
zero. A requirement of the interpretting software that it be able to
compute these fields as necessary from the previous information.
The field which you might want to explicitly specify might be "biClrUsed".
For 4-bit and 8-bit images this field indicates that not all of the
possible color entries are used and that the image contains "biClrUsed"
colors. If you are using only 32 colors with an 8-bit image, then you may
only want to save 32 of the possible 256 palette entries. Generally, set
this field to zero.
March 15, 1991
- 7 -
COLOR PALETTES
Each entry of a color palette is a RGBQUAD structure. The RGBQUAD
structure is defined in the "windows.h" include file as:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
The "rgbReserved" field is always zero. For each color used, the amount
of Blue, Green, and Red are filled into the structure and the structure is
written to the file. A value of zero in the "rgbBlue", "rgbGreen", or
"rgbRed" fields indicates that that particular component does not
contribute to the color composition. A value of 255 in any of these
fields indicates that the component contributes fully to the color
composition.
IMAGE DATA
There are three surprises about the ordering of image data in DIB image
file. The creator of this format was determined to be creative, and
certainly was.
Within the image data, each line written out is padded to the next four
byte quantity. So, if you had an 8-bit image which was only one pixel
wide, you still have to write out four bytes for every image line. The
number of bytes per line can be calculated as:
bytes_per_line = (width_in_pix * bit_depth + 31 ) / 32 * 4;
---or, in terms of the fields of the BITMAPINFOHEADER structure---
bytes_per_line = (biWidth * biBitCount + 31 ) / 32 * 4;
When writing out your image data, you must write it out bottom line first.
The bottom line of the image as you would look at it on the screen is the
first line of image data in the file.
For 1-bit, 4-bit, and 8-bit images, information is written as you would
expect. One bit images are padded eight pixels to a byte. Four bit
images are padded two pixels to a byte. Eight bit images are written one
pixel per byte. Twenty-four bit images are written three bytes per pixel.
However, for 24-bit images the information must be written out in the
order blue, green, red. While most image file formats write data out in
March 15, 1991
- 8 -
an "RGB" ordering, a DIB image file writes the data out in an "BGR"
ordering.
SUMMARY
This should provide enough information to create DIB images from
applications such as scanners or for image exporting routines. If you
find out any more about DIB images, please pass the information on to me
so that I can modify this document accordingly.
March 15, 1991
--
Thomas B. Kinsman, Rochester, NY, thomas@acadia.kodak.com
"Practice random kindness and senseless acts of beauty." -anon
Technical Details
Message-ID:
<1992Dec23.214432.18764@kodak.kodak.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!rpi!newsserver.pixel.kodak.com!kodak!sunshine!thomasShow Full Headers
Complete Article Headers
Newsgroups: comp.os.ms-windows.programmer.misc,alt.binaries.pictures.utilities Path: arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!rpi!newsserver.pixel.kodak.com!kodak!sunshine!thomas From: thomas@sunshine.Kodak.COM (Thomas Kinsman) Subject: DIB/BMP CREATION GUIDE, as requested. Message-ID: <1992Dec23.214432.18764@kodak.kodak.com> Keywords: DIB BMP Bitmaps File Formats Sender: news@kodak.kodak.com Organization: Precambiran Electronics, Rochester, NY Date: Wed, 23 Dec 92 21:44:32 GMT Lines: 484