IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

StretchDIBits en vb.net


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut StretchDIBits en vb.net
    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 !!)

    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
    Sachant que Data contient l'adresse des données bitmap (d'où le byval).
    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):
    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)
    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 ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    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 ?
    Ce point est résolu, en fait il faut écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .bisize= marshal.sizeof(DibInfo.bmiHeader)

Discussions similaires

  1. [Débat] Technologie .NET vs JAVA
    Par neo.51 dans le forum Débats sur le développement - Le Best Of
    Réponses: 1047
    Dernier message: 14/01/2019, 17h15
  2. [Débat] Expériences au sujet de .NET
    Par DevX dans le forum Débats sur le développement - Le Best Of
    Réponses: 46
    Dernier message: 25/05/2014, 12h16
  3. A ceux qui ont migré de VB6 vers VB.Net
    Par Fox dans le forum VB 6 et antérieur
    Réponses: 81
    Dernier message: 21/05/2008, 15h56
  4. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo