TRANSFORMER UN BITMAP EN DIB (Device Independant Picture)

On suppose qu'on dispose déjà du Handle (descripteur) d'une image en mode bitmap. Ce handle peut par exemple, être la propriété .Image ou .Picture (en fait, .Picture.Handle par défaut) d'un PictureBox.
Exemple : PicHandle = MyPictureBox.Picture ou PicHandle = MyPictureBox.Image

Ce Handle peut aussi être obtenu directement à partir d'un fichier image. Par exemple :
PicHandle = LoadPicture("ImageTest.bmp").Handle
Attention : dans ce cas, le Handle doit être détruit après usage au moyen de l'API DeleteObject

Dans l'exemple suivant, on demande ensuite de dessiner l'image résultante sur un périphérique d'affichage (Device Context) dont le Handle est HDCdest

Déclarations :

Private Const NULLPTR = 0&

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

' GESTION DE LA MEMOIRE
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hmem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hmem As Long) As Long

Private Type BITMAP
         bmType As Long
         bmWidth As Long
         bmHeight As Long
         bmWidthBytes As Long
         bmPlanes As Integer
         bmBitsPixel As Integer
         bmBits 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
         biXPelsPerMeter As Long
         biYPelsPerMeter As Long
         biClrUsed As Long
         biClrImportant As Long
End Type
Private Declare Function GetObjectBitmap Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, _
ByVal nCount As Long, lpObject As BITMAP) As Long

Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function StretchDIBits Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, lpBits As Long, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long

Dim Bm As BITMAP, lbPI As BITMAPINFO
Dim hmem As Long, hMemPtr As Long

Code :

' On suppose que PicHandle est le Handle de l'image à convertir

' (on a besoin d'un DC standard)
PicHdc = GetDC(NULLPTR)

' On récupère les infos du bitmap
rc = GetObjectBitmap(PicHandle, LenB(Bm), Bm)
' On définit les caractéristiques du DIB qu'on va obtenir
With lbPI.bmiHeader
         .biSize = Len(lbPI.bmiHeader)
         .biBitCount = 32 '(32 bits par pixel)
         .biHeight = Bm.bmHeight
         .biWidth = Bm.bmWidth
         .biPlanes = 1
         .biCompression = 0 ' (pas de compression)
End With
' On veut 4 octets par pixel (32 bits)
' On réserve un espace mémoire pour y stocker l'image en mode DIB
hmem = GlobalAlloc(&H40, Bm.bmHeight * Bm.bmWidth * 4)
hMemPtr = hmem
' On transforme l'image en DIB et on copie les datas dans la mémoire
rc = GetDIBits(PicHdc, PicHandle, 0, Bm.bmHeight, ByVal hMemPtr, lbPI, 0)

' On peut ensuite dessiner l'image sur un DC de destination : DCdest
rc = StretchDIBits(HDCdest, Xdest, Ydest, Widthdest, Heightdest, 0, _
0, Bm.bmWidth, Bm.bmHeight, ByVal hMemPtr, lbPI, 0, SRCCOPY)

' On libère la mémoire
rc = GlobalFree(hmem)

' On nettoie
rc = ReleaseDC(NULLPTR, PicHdc)

Retour à l'accueil