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 6 et antérieur Discussion :

Extraction image d'un metafile


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut Extraction image d'un metafile
    Bonjour

    Je cale sur un problème d'extraction d'image embarquées dans un fichier metafile.
    Pour cela j'utilise l'enumeration et j'arrive bien à produire des fichiers images.
    Le probléme survient avec le record de type EMR_STRETCHDIBITS. L'image obtenue n'a pas les bonnes couleurs pour certaines images.
    Voici un extrait du code que j'utilise.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Public Function CallBack_ENumMetafile(ByVal hdc As Long, _
                                          ByVal lpHtable As Long, _
                                          ByVal lpMFR As Long, _
                                          ByVal nObj As Long, _
                                          ByVal lpClientData As Long) As Long
      Dim PEnhEMR As EMR
      Dim PEnhStrecthDiBits As EMRSTRETCHDIBITS
      Dim tmpDc As Long
      Dim hBitmap  As Long
      Dim lRet As Long
      Dim BITMAPINFO As BITMAPINFO
      Dim pBitsMem As Long
      Dim pBitmapInfo As Long
      Static RecordCount As Long
     
      lRet = PlayEnhMetaFileRecord(hdc, ByVal lpHtable, ByVal lpMFR, ByVal nObj)
     
     
      RecordCount = RecordCount + 1
      CopyMemory PEnhEMR, ByVal lpMFR, Len(PEnhEMR)
      Select Case PEnhEMR.iType
      Case 1  'header
        RecordCount = 1
      Case EMR_STRETCHDIBITS
        CopyMemory PEnhStrecthDiBits, ByVal lpMFR, Len(PEnhStrecthDiBits)
        pBitmapInfo = lpMFR + PEnhStrecthDiBits.offBmiSrc
        CopyMemory BITMAPINFO, ByVal pBitmapInfo, Len(BITMAPINFO)
        pBitsMem = lpMFR + PEnhStrecthDiBits.offBitsSrc
     
        tmpDc = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
        hBitmap = CreateDIBitmap(tmpDc, _
                                BITMAPINFO.bmiHeader, _
                                CBM_INIT, _
                                ByVal pBitsMem, _
                                BITMAPINFO, _
                                DIB_RGB_COLORS)
        lRet = DeleteDC(tmpDc)
        If hBitmap Then
          'init du pcturebox qui va recevoir le bitmap
          frmExtractImgFromEmf.pctExport.Cls
          frmExtractImgFromEmf.pctExport.Picture = LoadPicture("")
          frmExtractImgFromEmf.pctExport.Width = BITMAPINFO.bmiHeader.biWidth
          frmExtractImgFromEmf.pctExport.Height = BITMAPINFO.bmiHeader.biHeight
          tmpDc = CreateCompatibleDC(frmExtractImgFromEmf.hdc)
          lRet = SelectObject(tmpDc, hBitmap)
          lRet = BitBlt(frmExtractImgFromEmf.pctExport.hdc, _
                        0, 0, _
                        frmExtractImgFromEmf.pctExport.Width, _
                        frmExtractImgFromEmf.pctExport.Height, _
                        tmpDc, _
                        0, 0, _
                        vbSrcCopy)
          DeleteDC tmpDc
          Set frmExtractImgFromEmf.pctExport.Picture = frmExtractImgFromEmf.pctExport.Image
          SavePicture frmExtractImgFromEmf.pctExport.Picture, App.Path & "\temp" & CStr(RecordCount) & ".bmp"
          MsgBox "la creation du bitmap a réussi"
          DeleteObject hBitmap
        Else
          MsgBox "la création du bitmap a échoué"
        End If
      End Select
      CallBack_ENumMetafile = True
     
    End Function
    je vous mets un lien vers le source complet , ce qui vous permetra de faire un test avec le fichier exemple joint.

    Je ne sais pas pas du tout ou est le problème, ma boule de cristal cassée me sussure un problème de palette. Je cale.

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Bonjour,
    Tu as essayé de remplacer DIB_RGB_COLORS par DIB_PAL_COLORS dans CreateDIBitmap de la fct de callback ?

  3. #3
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Vi, mais çà ne fait qu'afficher le même avec d'autre couleurs
    D'ailleurs, je suis pas sûr, mais il me semble que les couleurs affichées changent quelque fois entre différentes exécutions du programme.

    Mais j'ai fait tellement d'essais que je n'en suis pas sûr. (ca fait plusieurs jours que je tourne autour)

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Désolé, les fonctions graphiques ne sont assez étrangères.

    A première vue, la fonction de callback doit te retourner un pointeur vers une table de couleurs dans lpHTable ;
    tu devrais fouiller de ce coté.

  5. #5
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Arf, voilou une info très interessante, j'ignorais totalement à qoui servait ce parametre. Je vais fouiller par là. Mais avant je pars en villégiature pour deux petites semaines
    Alors merci beaucoup pour l'info, je l'enmènne avec moi dans mes bagages.

  6. #6
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Un petit coucou depuis la bretagne
    La piste de Dark n'a conduit nulle part, merci quand même Dark, l'idée était séduisante.
    J'ai continué mes recherches et j'ai trouvé une solution. Il s'agissait bien d'un problème de palette. En fait la palette se trouve derriere la structure de bitmapinfo. J'ai doncmodifié la déclaration de la structure de bitmapinfo comme suit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Type BITMAPINFO
            bmiHeader As BITMAPINFOHEADER
            bmiColors(255) As RGBQUAD
    End Type
    Pas très ortodoxe, mais çà fonctionne

    Encore un grand merci à ceux qui ont lu ce post.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. extraction Image pour copie dans word
    Par geomuse dans le forum IGN API Géoportail
    Réponses: 4
    Dernier message: 27/09/2011, 11h22
  2. [AC-2002] Extraction image Excel via appli Access
    Par Beub' dans le forum VBA Access
    Réponses: 4
    Dernier message: 27/04/2010, 15h37
  3. [MySQL] Extraction images en masse
    Par mickeys dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/09/2009, 12h05
  4. Extraction image VFW
    Par Natsboss dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/02/2008, 16h26
  5. Extraction image d'un pdf
    Par dodup64 dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 06/09/2007, 12h40

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