
 Area: F-QUICKBASIC 
  Msg#: 434                                          Date: 13 Apr 94  23:27:15
  From: MIKE AUDLEMAN                                Read: Yes    Replied: No 
    To: GREG FROMMER                                 Mark:                     
  Subj: BMP'S AND THERE WORKINGS

Subspace Message:
FR: Greg Frommer
TO: Mike Audleman
Coded Subject: BMP'S AND THERE WORKINGS

 GF> Yes I would very much like to persue this.. If you have any coad I
 GF> would very  much like to see some.. thank you
 GF> greg f

Here is a real hack job I did a while back to seperate a bunch of BMP
images into seperate color and B&W directories.  It is called from a
batch file using a "for %%x in (*.BMP)" type line.  The code reads the
header of the BMP and picks out the B&W ones and the color ones and then
moves them to their directories.  This file contains the TYPE statement
for a BMP file header which is probably the thing that you should
seperate from this file and save for your use.  I use this same header
TYPE statement in all my programs dealing with BMPs, both QB45 and VB.

-------------->8--------------------------------------------------
DEFINT A-Z
TYPE BitMapFileHeader               '14 Bytes
    bfType AS STRING * 2            '&H4D42 or "BM"
    bfSize AS LONG                  'Size of the file
    bfReserved1 AS INTEGER          'Not Used |Think these are used in
    bfReserved2 AS INTEGER          '"   "    |OS\2 BMPs but not sure
    bfOffBits AS LONG               'addr of start of actual data
    biSize AS LONG                  '40 (The Size of the BI header)
    biWidth AS LONG                 'Image Width
    biHeight AS LONG                'Image Height
    biPlanes AS INTEGER             '# of planes, DIBs have only 1
    biBitCount AS INTEGER           'bits per pixel (8 for 256 colors)
    biCompression AS LONG           'Compression type :BI_RGB = none
    biSizeImage AS LONG             'Image size (0 if Compression=BI_RGB
    biXPelsPerMeter AS LONG         '0
    biYPelsPerMeter AS LONG         '0
    biClrUsed AS LONG               'Number of colors actually used (Leave at
256)
    biClrImportant AS LONG          'Number of important colors (0 =  all)
    biColorTable AS STRING * 64     'Color Table. Size changes
END TYPE

DIM SHARED Text AS STRING * 256, Byte  AS STRING * 1, BMPHeader AS
BitMapFileHeader

'Process the command line into file and path
File$ = LTRIM$(COMMAND$)
File$ = RTRIM$(File$)
Spac% = INSTR(File$, " ")
IF Spac% = 0 THEN
        File1$ = File$
ELSE
        File1$ = MID$(File$, Spac% + 1)
        File$ = LEFT$(File$, Spac% - 1)
END IF
Backs = INSTR(File1$, "\")
Colon = INSTR(File1$, ":")
Path$ = ".\"
IF Backs > 0 THEN
        FOR X = LEN(File1$) TO Backs STEP -1
                IF MID$(File1$, X, 1) = "\" THEN Where = X: EXIT FOR
        NEXT X
        Path$ = LEFT$(File1$, Where)
        File1$ = Path$ + MID$(File1$, Where + 1, 8)
ELSEIF Colon > 0 THEN
        Path$ = LEFT$(File1$, Colon)
        File1$ = Path$ + MID$(File1$, Colon + 1, 8)
ELSE
        File1$ = LEFT$(File1$, 8)
END IF

IF INSTR(File1$, ".") > 0 THEN File1$ = LEFT$(File1$, INSTR(File1$, ".") - 1)

'Ok, here we go with the main loop:
OPEN File$ FOR BINARY AS 1 LEN = 8192 'Len 8192 makes it faster, not needed
IF LOF(1) = 0 THEN CLOSE : PRINT "File Length=0": KILL File$: END
GET 1, , BMPHeader 'Load the header of the file

'check for valid BMP file
IF BMPHeader.bfType <> "BM" OR BMPHeader.bfReserved1 <> 0 OR
BMPHeader.bfReserved2 <> 0 THEN
        CLOSE
        PRINT File$; " is not a recognized BMP type"
        END
END IF
CLOSE

'BitCount will be 1 for B&W
SELECT CASE BMPHeader.biBitCount
CASE 1
        SHELL "Move " + File$ + " " + Path$ + "b&w"
CASE ELSE
        SHELL "Move " + File$ + " " + Path$ + "color"
END SELECT

END

FUNCTION GetByte%
'This simple function gets a single byte from file and converts to integer
        GET 1, , Byte$
        GetByte% = ASC(Byte$)
END FUNCTION

-------------->8--------------------------------------------------
This section may be a bit long winded but it is vital you understand the
entries in the file and image headers.  The file header is distinguished
by the variables starting with "bf" and the image header variables start
with "bi".  Print this out and use a hex file viewer and peek at some
BMPs and compare values you find.  That is how I learned what is in
them and what they do.

---File Header area (Disk File oriented data)
This is always "BM" for BMP and DIB files
    bfType AS STRING * 2            '&H4D42 or "BM"

This should be set to the total file size including this header
    bfSize AS LONG                  'Size of the file

Set to 0 in every BMP I have.
    bfReserved1 AS INTEGER          'Not Used |Think these are used in
    bfReserved2 AS INTEGER          '"   "    |OS\2 BMPs but not sure

This is the start address relitive to the start of the file where the
actual image data starts
    bfOffBits AS LONG               'addr of start of actual data

----Image Header area  (Image oriented data)
This is the size of the image header, always 40
    biSize AS LONG                  '40 (The Size of the BI header)

This is the size of the image (ex, 1024 & 768)
    biWidth AS LONG                 'Image Width
    biHeight AS LONG                'Image Height

Number of bit planes.  BMP and DIB only have 1
    biPlanes AS INTEGER             '# of planes, DIBs have only 1

This is the number of bits needed to represent each pixel.  This
directly equates to the number of possible colors.
        1 B&W (2 color)
        4 for 16 colors
        8 for 256 colors
        24 for 24 bit true color
    biBitCount AS INTEGER           'bits per pixel (8 for 256 colors)

This marks the file compression type.
  0 for No compression (the most common)
  1 for RLE8 (Run Length Encoding, 8 Bit)
  2 for RLE4 (""    ""     ""      4 bit)
    biCompression AS LONG           'Compression type :BI_RGB = none

This is the data size.  If Compression is 0 then this can be 0 too
    biSizeImage AS LONG             'Image size (0 if Compression=BI_RGB

These specify the the pixels per meter that the BMP/DIB was designed for
 or the resolution if you will.
    biXPelsPerMeter AS LONG         '0
    biYPelsPerMeter AS LONG         '0

This is the number of colors that are actually used in the color table.
For example, you have a 256 color BMP that actually has only 12 colors
then this value would be 12.  This is mainly used by windows for palate
managemet along with the next entry. Set to 0 to specify all colors.
    biClrUsed AS LONG               'Number of colors actually used (Leave at
256)

This is the number of colors that are important in the color table.
For example, you have a 256 color BMP that actually has only 12 colors
and 5 of them were important to the image and the remaining were shading
or whatever, then this value would be 5.  This is mainly used by windows
for palate managemet along with the previous entry. Set to 0 to specify
all colors.
    biClrImportant AS LONG          'Number of important colors (0 =  all)

This is the color table or palate for the image.  The size will vary
with the number of colors specified by the biBitCount entry.
Number of Colors:      Size of Color table:
        2                       8
        16                      64
        256                     1024
        2^24                    0 (Not used for 24 bit true color)
    biColorTable AS STRING * 64     'Color Table. Size changes

Later ... Mike Audleman
 
... Well I've confirmed it - cats can't swim.
___ Blue Wave/QWK v2.12


-!-
 ! Origin: Exec-PC BBS > World's Largest BBS < (1:154/280)

