DIB Section

Category: BMP Tutor Series (API)

Date: 03-28-2012

Return to Index


 
http://www.tutorialized.com/view/tutorial/DIB-SECTION/14881
 
'Create DC
DC = CreateCompatibleDC(Picture1.hdc)
 
With BI.bmiHeader
    .biSize = 40
    .biWidth = Picture1.ScaleWidth     ' Picture Width
    .biHeight = -Picture1.ScaleHeight  ' Picture Height(dont confuse with the (-) sign.Just make it compulsory)
    .biPlanes = 1
    .biBitCount = 32
    .biSizeImage = (((Picture1.ScaleWidth * 3) + 3) AND &HFFFFFFFC) * Picture1.ScaleHeight ' This is how we can calculate the Image Size in Bytes
End With
 
DIBSection = CreateDIBSection(DC, BI, DIB_RGB_COLORS, Addr, 0, 0)
 
'Select DIB Section into DC
oldDIB = SelectObject(DC, DIBSection)
 
==============================================================================
 
' Copy image from control into EMPTY DIB Section
Call BitBlt(DC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hdc, 0, 0, SRCCOPY)
 
' We have to go through each and every pixel in the Bitmap
For X = 0 To Picture1.ScaleWidth
  For Y = 0 To Picture1.ScaleHeight
        Pixel = GetPixel(DC, X, Y) ' Get one pixel from the DIB Section
        SetPixelV(DC, X, Y, GrayScale)
  Next Y
Next X
' Copying the DC content back into a control
Call BitBlt(Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, DC, 0, 0, SRCCOPY)
 
==============================================================================
 
 
 
' Copy image from control into EMPTY DIB Section
Call BitBlt(DC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hdc, 0, 0, SRCCOPY)
 
' Getting the Pixel Array of the DIB Section
ReDim bDIB(1 To Picture1.ScaleWidth, 1 To Picture1.ScaleHeight) As RGBQUAD
Call GetDIBits(DC, DIBSection, 0&, Picture1.ScaleHeight, bDIB(1, 1), BI.bmiHeader, 0&)
 
 
' We have to go through each and every pixel in the Bitmap
For X = 1 To Picture1.ScaleWidth
  For Y = 1 To Picture1.ScaleHeight
        bDIB(X, Y).rgbBlue = 0.3 * bDIB(X, Y).rgbRed + 0.587 * bDIB(X, Y).rgbGreen + 0.114 * bDIB(X, Y).rgbBlue
        bDIB(X, Y).rgbGreen = bDIB(X, Y).rgbBlue
        bDIB(X, Y).rgbRed = bDIB(X, Y).rgbBlue
  Next Y
Next X
 
' Set modified bit array back the Pixel Array of the DIB Section
Call SetDIBits(DC, DIBSection, 0&, Picture1.ScaleHeight, bDIB(1, 1), BI.bmiHeader, 0&)
 
' Copying the processed picture into the Picturebox
Call BitBlt(Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, DC, 0, 0, SRCCOPY)
MsgBox "Operation completed in " & GetTickCount - ti & " ms"
End Sub
 
 
==============================================================================
 
 
' Copy image from control into EMPTY DIB Section
Call BitBlt(DC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hdc, 0, 0, SRCCOPY)
 
' Getting the Pixel Array of the DIB Section
ReDim bDIB(1 To Picture1.ScaleWidth, 1 To Picture1.ScaleHeight) As RGBQUAD
Call GetDIBits(DC, DIBSection, 0&, Picture1.ScaleHeight, bDIB(1, 1), BI.bmiHeader, 0&)
 
 
' We have to go through each and every pixel in the Bitmap
For X = 1 To Picture1.ScaleWidth
  For Y = 1 To Picture1.ScaleHeight
        ' The following is the way we can calculate the negative shade of every pixel in the DIB Section
        ' Just Red = 255 - Red , Green = 255 - Green , Blue = 255 - Blue
        bDIB(X, Y).rgbBlue = 255 - bDIB(X, Y).rgbBlue
        bDIB(X, Y).rgbGreen = 255 - bDIB(X, Y).rgbGreen
        bDIB(X, Y).rgbRed = 255 - bDIB(X, Y).rgbRed
  Next Y
Next X
' Setting back the Pixel Array of the DIB Section
Call SetDIBits(DC, DIBSection, 0&, Picture1.ScaleHeight, bDIB(1, 1), BI.bmiHeader, 0&)
' Copying the processed picture into the Picturebox
Call BitBlt(Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, DC, 0, 0, SRCCOPY)
MsgBox "Operation completed in " & GetTickCount - ti & " ms"
End Sub
 
 
==============================================================================
 
Private Sub Form_Unload(Cancel As Integer)
Erase bDIB()
Call SelectObject(DC, oldDIB) ' Good Programming Practice
Call DeleteObject(DIBSection) ' Deleting the DIB Section
Call DeleteDC(DC)             ' Deleting the container DC
End Sub
 
 
 
'Discuss Creation of DIB Section
BI.bmiHeader.biSize = 40      'The Header Size is always 40 bytes but the programmer can obviously use len(BI.bmiHeader).
 
BI.bmiHeader.biWidth = Picture1.ScaleWidth
BI.bmiHeader.biHeight = -Picture1.ScaleHeight  ' Picture Width  Device Independent Bitmaps are always upside-down, so to get it in the correct allignment we specify a (-) minus sign with the height.
BI.bmiHeader.biPlanes = 1        '  biPlanes specifies the number of planes for the target device. This value must be set to 1.
BI.bmiHeader.biBitCount = 32      'bits per pixel
BI.bmiHeader.biSizeImage = (((Picture1.ScaleWidth * 3) + 3) AND &HFFFFFFFC) * Picture1.ScaleHeight    'we are not only calculating the size, rather we are also making it compatible with 32 bit boundary. This is neccessary so do it in the same way in your projects.
DIBSection = CreateDIBSection(DC, BI, DIB_RGB_COLORS, Addr, 0, 0)
 
'gbs_00536
'Date: 03-10-2012


created by gbSnippets
http://www.garybeene.com/sw/gbsnippets.htm