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

WinDev Discussion :

Image dynamique en Windev


Sujet :

WinDev

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut Image dynamique en Windev
    Bonsoir,

    Quelqu'un peut-il m'aider à traduire vers Windev les codes suivants (C/Delphi) qui donnent le même résultat ?

    Il s'agit de créer/afficher une image.

    Code c : 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
     
            unsigned char *data;
            EdsVoid *ptr;
            EdsUInt32 datalen;
     
            EdsGetLength(stream, &datalen);
     
     
            data = (unsigned char *)malloc(sizeof(unsigned char*) * datalen);
     
            EdsGetPointer(stream, (EdsVoid**)&ptr);
            memcpy(data, ptr, datalen);
     
            QPixmap *pix= new QPixmap();
            pix->loadFromData(data,datalen);
     
    free(data);

    Code delphi : 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
     
    MemStream := TMemoryStream.Create;
          try
            MemStream.WriteBuffer(ImageData^, ImageSize);
            MemStream.position := 0;
            JPG := TJPEGImage.Create; // The Stream is a JPEG Image
            try
              JPG.LoadFromStream(MemStream);
              //JPG.SaveToFile('LVSteam.jpg');
              if not Assigned(Image.Picture.Bitmap) then
                Image.Picture.Bitmap := TBitmap.Create;
              Image.Picture.Bitmap.Assign(JPG);
              Result := True;
            Finally
              JPG.Free;
            end;
          finally
            MemStream.Free;
          end;

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    GDIPLUS comporte une API qui permet d'afficher une image à partir d'un Stream.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Bonsoir Patrice,

    Merci de l'info je ne connais pas, je vais regarder sur Google.

    L'utilises-tu et est-ce facilement intégrable dans WinDev ?

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    GDIPLUS est une API développée (et commercialisée ?) par Patrice... il doit la connaître assez bien
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    GDIPLUS est une API standard de Windows qui existe depuis 2002, et qui est beaucoup plus complète que GDI32.

    Oui j'utilise directement la Flat API GdipCreateBitmapFromStream (ce qui est plus rapide et léger que de passer par une méthode de la classe Bitmap).
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    La méthode Bitmap.FomStream est documentée ici :
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Sinon, GDImage.dll (dont je suis l'auteur), comporte directement une fonction qui fait tout le travail délicat d'allocation mémoire.
    l'API se nomme ZI_LoadImageFromStream et elle est disponible dans la collection de procédure GDImage.wdg qui est livrée avec mes projets WinDev récents.

    Les fichiers Stream étant de type compound, on doit passer à la fonction ZI_LoadImageFromStream un pointeur sur le buffer qui contient les datas, mais le buffer en question peut provenir d'un fichier ou d'une zone mémoire.

    ...

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    GDImage.dll est un fichier libre de droit, c'est-à-dire que je peux intégrer dans mon Projet ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    L'utilisation de GDImage à titre perso est libre de droit.

    Pour l'intégrer dans un projet commercial, vous devez au préalable faire l'acquisition d'une licence permettant de la redistribuer avec tous vos projets sans royalties.

    ...

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Je travaille sur un projet perso (astrophoto), qui n'a pas de vocation commerciale...

    Pour ma culture perso quel est le coût d'une licence ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Citation Envoyé par seb-65 Voir le message
    Je travaille sur un projet perso (astrophoto), qui n'a pas de vocation commerciale...

    Pour ma culture perso quel est le coût d'une licence ?
    www.zapsolution.com

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Je vais aller voir le site, merci.

    As-tu un exemple avec GDI+ concernant l'utilisation d'un Stream ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    La problématique, c'est son utilisation avec un champ image WinDev.

    Avec un champ GDImage je peux vous faire {facilement} un exemple en WD17.

    Avec un champ image WinDev c'est beaucoup plus délicat, car il faut lui donner un nom d'image.

    Dans un Stream, l'extension n'a pas besoin d'être précisée, c'est la fonction elle même qui détermine si le buffer contient un format d'image reconnu.
    Elle retourne alors un handle vers l'image mémoire, qui doit être impérativement libéré lorsqu'on en a plus besoin, sous peine de créer un "memory leak".

    L'avantage d'utiliser une bibliothèque graphique, c'est qu'elle prend en charge tout l'aspect complexe de la chose, car je ne parle même pas de CreateStreamOnHGlobal qu'il est nécessaire d'utiliser pour l'allocation du buffer, qui là encore doit être libéré correctement.

    Si vous n'êtes pas un expert avec l'API bas niveau, je vous déconseille vivement de vous y risquer avec les seules fonctions du WL.

    Concernant GDImage, voici le prototype d'appel pour utiliser la fonction ZI_LoadImageFromStream dans WinDev.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FUNCTION ZI_LoadImageFromStream(LOCAL hWnd is system int, LOCAL lpBuffer is system int, LOCAL BufferSize is unsigned int)
    nRet is int = API("GDImage", "ZI_LoadImageFromStream", hWnd, lpBuffer, BufferSize)
    RESULT nRet
    Si la fonction retourne -1 (TRUE), c'est que tout c'est bien passé.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut Exemple de lecture d'un fichier Stream avec GDImage
    Je vous ai fait rapidement un projet WD17, montrant la lecture d'un fichier Stream qui se trouve dans le sous dossier EXE\images de l'application.

    Voici le code qui charge le buffer à partir d'un fichier.
    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
    PROCEDURE GDImageGetStreamFromFile(LOCAL sFileStream is string)
    IF (IsWindow(gP.hCtrl)) THEN
    	IF fFileExist(sFileStream) THEN
    		nBufferSize is unsigned int = fSize(sFileStream)
    		fHandle is int = fOpen(sFileStream, foRead)
    		IF (fHandle <> -1) THEN
    			buffer is array dynamic of nBufferSize 1-byte int
    			fRead(fHandle, nBufferSize, &buffer)	
    			fClose(fHandle); fHandle = 0
    			IF (NOT ZI_LoadImageFromStream(gP.hCtrl, &buffer, nBufferSize)) THEN
    				Trace("Error")
    			END
    		END
    	END 
    END
    Note: Vous pouvez tester avec différentes images que vous renommez sans extension, le programme détectera automatiquement le bon format.

    ...
    Fichiers attachés Fichiers attachés

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Bonsoir Patrice,

    Merci pour l'exemple je vais regarder cela en suivant

    Par contre que donnerai l'utilisation de votre DLL pour mon cas d'utilisation d'un Stream provenant d'un APN ? Je ne suis pas un pro de l'API et de l'utilisation des DLL, mais j'ai quasiment intégré les différentes fonctions de la SDK Canon dans WinDev.

    Je bute maintenant sur le mode LiveView pour la génération d'image dynamique sous WinDev

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Vous devez récupérer un pointeur sur le Stream et connaître sa taille.

    Mais le préalable, est que le Stream soit compatible avec celui de l'API Microsoft, sinon çà ne fonctionnera pas avec ZI_LoadImageFromStream.

    En ce qui me concerne j'ignore tout de l'API proprétaire des appareils photo numériques CANON, ni si le Stream CANON utilise un format standard ou des RAW datas (données brutes).

    ...

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    J'ai vu un exemple sous Visual Studio qui utilise GDI+ pour le Display de l'image (http://www.codeproject.com/Articles/...rial-in-Csharp)

    Pour vous donner une idée du code de l'API voici un sample de leur doc SDK :

    Code c : 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
    65
    66
    67
    68
    69
    70
    71
    72
     
    EdsError startLiveview(EdsCameraRef camera)
    {
    EdsError err = EDS_ERR_OK;
    // Get the output device for the live view image
    EdsUInt32 device;
    err = EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0 , , sizeof(device), &device );
    // PC live view starts by setting the PC as the output device for the live view image.
    if(err == EDS_ERR_OK)
    {
    device |= kEdsEvfOutputDevice_PC;
    err = EdsSetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0 , sizeof(device), &device);
    }
    // A property change event notification is issued from the camera if property settings are made successfully.
    // Start downloading of the live view image once the property change notification arrives.
    }
    EdsError downloadEvfData(EdsCameraRef camera)
    {
    EdsError err = EDS_ERR_OK;
    EdsStreamRef stream = NULL;
    EdsEvfImageRef = NULL;
    // Create memory stream.
    err = EdsCreateMemoryStream( 0, &stream);
    // Create EvfImageRef.
    if(err == EDS_ERR_OK)
    {
    err = EdsCreateEvfImageRef(stream, &evfImage);
    }
    // Download live view image data.
    if(err == EDS_ERR_OK)
    {
    err = EdsDownloadEvfImage(camera, evfImage);
    }
    // Get the incidental data of the image.
    if(err == EDS_ERR_OK)
    {
    // Get the zoom ratio
    EdsUInt32 zoom;
    EdsGetPropertyData(erfImage kEdsPropID_Evf_ZoomPosition, 0 , sizeof(zoom), &zoom);
    // Get the focus and zoom border position
    EdsPoint point;
    EdsGetPropertyData(erfImage kEdsPropID_Evf_ZoomPosition, 0 , sizeof(point), &point);
    }
    //
    // Display image
    //
    // Release stream
    if(stream != NULL)
    {
    EdsRelease(stream);
    Stream = NULL;
    }
    // Release evfImage
    if(evfImage != NULL)
    {
    EdsRelease(evfImage);
    evfImage = NULL;
    }
    }
    EdsError endLiveview(EdsCameraRef camera)
    {
    EdsError err = EDS_ERR_OK;
    // Get the output device for the live view image
    EdsUInt32 device;
    err = EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0 , , sizeof(device), &device );
    // PC live view ends if the PC is disconnected from the live view image output device.
    if(err == EDS_ERR_OK)
    {
    device &= ~kEdsEvfOutputDevice_PC;
    err = EdsSetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0 , sizeof(device), &device);
    }
    }

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J'ai regardé l'exemple et je ne vois rien qui ressemble à l'utilisation d'un Stream compatible avec l'API GdipCreateBitmapFromStream

    Dans la fonction
    protected Bitmap GetImage(IntPtr imgStream, ImageSource imageSource)
    est effectuée au péalable une permutation des composantes B et R, pour passer de RGB en BGR.

    pour utiliser
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    return new Bitmap(outputSize.Width, outputSize.Height, datalength, PixelFormat.Format24bppRgb, streamPointer);

    mais on pourrait tout aussi bien utiliser un DIB GDI32 classique, pas besoin de passer par GDI+.

    ...

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    mais on pourrait tout aussi bien utiliser un DIB GDI32 classique, pas besoin de passer par GDI+.
    C'est du chinois là pour moi

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Avec un DIB GDI32, vous pourriez copier directement le bitmap dans un champ image WinDev en utilisant la fonction dDébutDessin,
    et bien entendu il faut libérer le handle du bitmap lorsqu'il n'est plus utilisé (DeleteObject)

    Si c'est toujours du chinois, c'est que avez fait l'impasse sur l'apprentissage des fondements de la programmation.
    Rassurez-vous c'est très fréquent dans le monde WinDev, mais dans ce cas je ne peux rien faire de plus pour vous aider, sinon écrire le code à votre place.

  19. #19
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Cela a été ma première idée d'utiliser la fonction DébutDessin, mais sans succès... J'ai du mal à comprendre de que je dois mettre dans cette fonction

    J'avais crée un buffer dans lequel je passai le contenu de stream ou evfImage, mais cela fait planter l'exécution...

    Je ne suis pas un pro du dév comme vous, certes, mais j'essaye de comprendre ! Mais ici je dois dire que je n'arrive pas du tout à trouver une issue

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Regardez mon exemple DibTutor, çà vous mettra peut être sur la bonne piste.
    http://www.developpez.net/forums/d14...ment-couleurs/

    Une question, qu'elle est la résolution en pixel des images que vous récupérez ?

    ...

Discussions similaires

  1. [CR8.5] Image dynamique sans utiliser RDC ou Blob
    Par lrp dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/12/2005, 14h43
  2. [VB.NET] Afficher une image dynamiquement
    Par Sadneth dans le forum ASP.NET
    Réponses: 20
    Dernier message: 07/01/2005, 16h26
  3. [FLASH MX2004] Masque image dynamique
    Par bolo dans le forum Flash
    Réponses: 6
    Dernier message: 07/11/2004, 18h55
  4. [C#] ajouter une image dynamiquement
    Par h_imane dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/04/2004, 11h27
  5. [CR7] Insérer une image dynamiquement
    Par yoloosis dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 28/07/2003, 09h54

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