Help me (converting color bitmaps to monocrome to save space) 
Author Message
 Help me (converting color bitmaps to monocrome to save space)

Hi, I' m new along this group ....
Can anyone of you give me a hint ?
I need to make SavePicture method more flexible
implementing storage of monocrome bitmaps
from within VB5.
I cannot find any Win API to directly save bitmaps to files.
I also failed copying (by BitBlt) to and fro a monocrome
memory bitmap (built by CreateBitmap), for it was
automatically converted to truecolor.
Thank you all in advance.


Sun, 05 Aug 2001 03:00:00 GMT  
 Help me (converting color bitmaps to monocrome to save space)
Bitmap files start with a fileheader, then an infoheader, followed by
the palette entries (unless it's a 24-bit bmp), and finally the bitmap
bits themselves.  The only complication is that the palette and bitmap
bits are Dword-aligned, which means that palette entries are RGBQUADs,
and each scan line of bitmap bits has to have an even multiple of 4
bytes (up to 3 padding bytes are added if necessary).

I've got a routine here to save a picturebox as a monochrome bitmap:
you should find it pretty easy to change it for 16- and 256-color
standard palettes (if not, just ask more questions here!).  Custom
palettes are quite a bit more work...

Oh, and the picturebox must have AutoRedraw = True, ScaleMode = vbPixel
(3).

Good luck!

Jim Deutch
MS Dev MVP

Private Type BITMAPFILEHEADER    '14 bytes
   bfType As Integer
   bfSize As Long
   bfReserved1 As Integer
   bfReserved2 As Integer
   bfOffBits As Long
End Type

Private Type BITMAPINFOHEADER   '40 bytes
   biSize As Long
   biWidth As Long
   biHeight As Long
   biPlanes As Integer
   biBitCount As Integer
   biCompression As Long
   biSizeImage As Long
   biXPel{*filter*}eter As Long
   biYPel{*filter*}eter As Long
   biClrUsed As Long
   biClrImportant As Long
End Type

Private Type RGBQUAD
   rgbBlue As Byte
   rgbGreen As Byte
   rgbRed As Byte
   rgbReserved As Byte
End Type

Private Type BITMAPINFO_1
   bmiHeader As BITMAPINFOHEADER
   bmiColors(1) As RGBQUAD
End Type

Private Const PIXEL As Integer = 3
Private Const DIB_RGB_COLORS As Long = 0
Private Const PALVERSION = &H300

Private Declare Function GetDIBits1 Lib "gdi32" Alias "GetDIBits" _
  (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long,
_
  ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO_1, _
  ByVal wUsage As Long) As Long

Private Sub Save1(pic As PictureBox)
Dim SaveBitmapInfo_1 As BITMAPINFO_1
Dim SaveFileHeader As BITMAPFILEHEADER
Dim SaveBits() As Byte
Dim BufferSize As Long
Dim fNum As Long
Dim Retval As Long
Dim nLen As Long
Const BitsPixel = 1

    'size a buffer for the pixel data
    BufferSize = ((pic.ScaleWidth / 8 + 3) And &HFFFC) *
pic.ScaleHeight
    ReDim SaveBits(0 To BufferSize - 1)
    'fill the header info for the save copy
    With SaveBitmapInfo_1.bmiHeader
        .biSize = 40
        .biWidth = pic.ScaleWidth
        .biHeight = pic.ScaleHeight
        .biPlanes = 1
        .biBitCount = BitsPixel
        .biCompression = 0
        .biClrUsed = 0
        .biClrImportant = 0
        .biSizeImage = BufferSize
    End With
    nLen = Len(SaveBitmapInfo_1)
    'get the bitmap from the picturebox
    Retval = GetDIBits1(pic.hdc, pic.Image, 0, _
        SaveBitmapInfo_1.bmiHeader.biHeight, SaveBits(0),
SaveBitmapInfo_1, DIB_RGB_COLORS)

    ' create a header for the save file
    With SaveFileHeader
       .bfType = &H4D42
       .bfSize = Len(SaveFileHeader) + nLen + BufferSize
       .bfOffBits = Len(SaveFileHeader) + nLen
    End With

    ' save it to disk
    fNum = FreeFile

    Open m_SaveFileName For Binary As fNum
    Put fNum, , SaveFileHeader
    Put fNum, , SaveBitmapInfo_1
    Put fNum, , SaveBits()
    Close fNum

End Sub



Quote:
> Hi, I' m new along this group ....
> Can anyone of you give me a hint ?
> I need to make SavePicture method more flexible
> implementing storage of monocrome bitmaps
> from within VB5.
> I cannot find any Win API to directly save bitmaps to files.
> I also failed copying (by BitBlt) to and fro a monocrome
> memory bitmap (built by CreateBitmap), for it was
> automatically converted to truecolor.
> Thank you all in advance.



Mon, 06 Aug 2001 03:00:00 GMT  
 
 [ 2 post ] 

 Relevant Pages 

1. Saving Bitmaps to different color modes

2. Loading and saving 256 color bitmaps

3. Saving 16/256 color bitmaps

4. Space Space Space Space Space Space Space

5. Space Space Space Space Space Space Space

6. Space Space Space Space Space Space Space

7. HELP! drop-down menus with color bitmaps

8. help - Memory DC Bitmaps Black&white instead of color

9. Help!: Converting Bitmaps to Icons

10. Help! Saving Bitmaps

11. HELP!! - Saving Bitmaps+Data

12. Converting RGB-color to HEX color

 

 
Powered by phpBB® Forum Software