Bonjour,
Cela fait quelques jours que je galère ...
Je souhaite utiliser la GDI32 sous vb.net, ce pour des raisons précises (ne me répondez pas que GDI+ est mieux ou qu'avec GDI+ ...).
Je récupère un bitmap via une dll et je voudrais l'afficher sur un DC avec StretchDIBits.
Quelqu'un a t-il implémenté cette api sous vb.net ?
mon code (qui n'affiche rien !!)
Sachant que Data contient l'adresse des données bitmap (d'où le byval).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 <StructLayout(LayoutKind.Sequential)> Public Structure BITMAPINFOHEADER Public biSize As Integer Public biWidth As Integer Public biHeight As Integer Public biPlanes As Short Public biBitCount As Short Public biCompression As Integer Public biSizeImage As Integer Public biXPelsPerMeter As Integer Public biYPelsPerMeter As Integer Public biClrUsed As Integer Public biClrImportant As Integer End Structure <StructLayout(LayoutKind.Sequential)> Public Structure RGBQUAD Public rgbBlue As Byte Public rgbGreen As Byte Public rgbRed As Byte Public rgbReserved As Byte End Structure <StructLayout(LayoutKind.Sequential)> Public Structure BITMAPINFO Public bmiHeader As BITMAPINFOHEADER <MarshalAs(UnmanagedType.ByValArray, sizeconst:=256)> Public bmiColors() As RGBQUAD End Structure Private Declare Function StretchDIBits Lib "gdi32" (ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal wSrcWidth As Integer, ByVal wSrcHeight As Integer, ByVal lpBits As IntPtr, ByRef lpBitsInfo As BITMAPINFO, ByVal wUsage As Integer, ByVal dwRop As Integer) As Integer Public Sub affichebitmap(ByVal G As Graphics) Dim mbinfo As BITMAPINFO mbinfo = extGetDIBFromBitmap(Me) Dim mhdc As IntPtr = G.GetHdc StretchDIBits(mhdc, 0, 0, Width / 40, Height / 40, 0, 0, Width, Height, Data, mbinfo, DIB_RGB_COLORS, SRCAND) G.ReleaseHdc() End Sub
En l'état rien ne s'affiche, si je passe la structure Bitmapinfo par valeur au lieu de le passer par référence là j'affiche un rectangle noir sur le DC de la taille attendue (0,0, Width / 40, Height / 40). Mais il me semble que la fonction attend un pointeur sur la structure, ce devrait donc être "byRef" non ?
De même la nature de la structure BITMAPINFO peut-elle être en cause ?
Dans le code de la fonction extGetDIBFromBitmap
j'écris ceci pour affecter les couleurs (ici bicolore):
Autre point qui me laisse perplexe si dans ma structure bitmapinfo.bmiheader j'affecte une valeur à .biSize = Len(DibInfo.bmiHeader) (40 octets) j'obtiens une exception à l'appel de l'API. Pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ReDim .bmiColors(255) .bmiColors(0).rgbBlue = 0 : .bmiColors(0).rgbGreen = 0 : .bmiColors(0).rgbRed = 0 'Le premier vaut Red=0,Green=0,Blue=0 donc du noir (#000000) .bmiColors(1).rgbBlue = 255 : .bmiColors(1).rgbGreen = 255 : .bmiColors(1).rgbRed = 255 'Le second vaut Red=255,Green=255,Blue=255 donc blanc (#FFFFFF)
Partager