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)