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

C++Builder Discussion :

Image GIF en ressource


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut Image GIF en ressource
    Bonjour à tous

    Je cherche à ajouter une image GIF en ressource mon application pour pouvoir la charger ensuite.

    J'ai choisi une GIF car cette image doit avoir un fond transparent.

    J'ai utilisé la même méthode que pour une BITMAP expliqué dans la FAQ en remplacant BITMAP par GIF (Utilisé pour DELPHI)

    et lorsque je veux charger ma ressource, cela me dit Ressource inconnue.

    Merci d'avance pour votre aide

  2. #2
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Personne me peut m'aider ?

  3. #3
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    il faudrait en fait que tu la stock en ressource en tant que RCDATA, puis que tu la retire dans TStream pour finalement la convertir en gif.

    La méthode est assez lourde, mais je l'ai faite pour mettre un jpeg en ressource.
    Faut que je retrouve ca dans mes archives et je te montre.

  4. #4
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    C'est sympa de ta part

    Pour l'instant, j'utilise un TImage dans lequel je charge ma gif dans l'inspecteur d'objet mais le souci, c'est qu'a chaque fois que je réouvre mon projet, il faut aller recharger l'image. C'est un peu chiant.

  5. #5
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    voilà la méthode pour charger le contenu d'un Timage dans la ressource (dans mon cas un bmp):
    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
     
       TMemoryStream *image = new TMemoryStream();
       Image1->Picture->Graphic->SaveToStream(image);
       image->Position = 0;
     
    //procédure de sauvegarde
       AnsiString TempPath,NewPath,OriginalPath;
     
       GetTempPath(200,TempPath.c_str());
       GetTempFileName(TempPath.c_str(), "TMP",0,NewPath.c_str());
       OriginalPath = Application->ExeName;
     
       if(MoveFileEx(OriginalPath.c_str(),NewPath.c_str(),MOVEFILE_REPLACE_EXISTING) == FALSE)
           Application->MessageBox("Impossible de déplacer l'exe","Erreur",MB_OK+MB_ICONWARNING);
       if(CopyFile(NewPath.c_str(),OriginalPath.c_str(),FALSE) == FALSE)
           Application->MessageBox("Impossible de copier l'exe","Erreur",MB_OK+MB_ICONWARNING);
       if(MoveFileEx(NewPath.c_str(),NULL,MOVEFILE_DELAY_UNTIL_REBOOT) == FALSE)
           Application->MessageBox("Impossiblede déplacer la copie","Erreur",MB_OK+MB_ICONWARNING);
     
       DWORD dwFileSize, dwBytesRead,dwBytesWritten;
       LPBYTE lpBuffer;
     
       HANDLE hResource = BeginUpdateResource(OriginalPath.c_str(), FALSE);
       if(NULL != hResource)
       {
           if(UpdateResource(hResource,RT_RCDATA,"IMAGEBMP",MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),(LPVOID)image->Memory, (DWORD)image->Size) != FALSE)
           {
                if(EndUpdateResource(hResource, FALSE) == FALSE)
                    ShowMessage("Error "+IntToStr(GetLastError()));
           }
           else
                 ShowMessage("Error "+IntToStr(GetLastError()));
       }
       delete image;
    Pour le recharger j'ai un peu plus de mal, vu que j'ai chargé un TMemoryStream en ressources, et que je ne peux en tirer qu'un TResourceStream, j'ai encore des erreurs de compilation, mais voilà ou j'en suis. J'ai réussi à la charger en mémoire il doit bien être possible de l'en retirer:
    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
     
       HRSRC hnd = FindResource(  NULL, "IMAGEBMP", RT_RCDATA);
       if(hnd != NULL)
       {
            TResourceStream *Res=new TResourceStream((int)HInstance,"IMAGEBMP",RT_RCDATA);
            //TMemoryStream *image = new TMemoryStream();
            //Res->Read(image,Res->Size);
            Image1->Picture->Graphic->LoadFromStream(dynamic_cast<TMemoryStream>(*Res));
            //TMemoryStream *image = new TMemoryStream();
            //Res->Read(image,Res->Size);
            //image->Seek( 0, soFromBeginning );
            //Graphics::TBitmap *image = new Graphics::TBitmap(Res);
            //Image1->Picture->Bitmap->LoadFromStream(image);
            delete Res;
            //delete image;
     
       }
    Si quelqun sais comment faire, je suis à son écoute.
    Je continu à voir comment faire de mon côté.

  6. #6
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Méthode bourrin, mais qui fonctionne dans un premier temps:
    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
     
       hnd = FindResource(  NULL, "IMAGEBMP", RT_RCDATA);
       if(hnd != NULL)
       {
            //chargement de la ressource
            TResourceStream *Res=new TResourceStream((int)HInstance,"IMAGEBMP",RT_RCDATA);
            TMemoryStream *image = new TMemoryStream();
            //conversion de la ressource en TMemoryStream pour retrouver le même format enregistré
            Res->SaveToStream(image);
            image->Position = 0;
            //sauvegarde de l'image dans un fichier pour la recharger plus facilement
            image->SaveToFile("image1.bmp");
            //supression de l'image et des variables
            Image1->Picture->Bitmap->LoadFromFile("image1.bmp");
            DeleteFile("image1.bmp");
            delete Res;
            delete image;
       }
    A voir pour trouver mieux comme méthode (et ca doit forcément exister )

  7. #7
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci pour ton aide, je vais étudié ca.

  8. #8
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    J'ai utilisé ta deuxième méthode, qui consiste à extraire la ressource et la sauvegarder dans un fichier. Cela fonctionne nikel.

    J'extrait mes images au lancement de l'application et je les supprime quand je quitte.

    Concernant ta première solution, c'est un peut compliquer pour moi.

    En tout cas, merci beaucoup pour ton aide.

  9. #9
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    En fait, la première ne fonctionne pas, c est pour ca que j ai apporté l autre solution.

    Il faudrait voir ca d un peu plus près pour la mettre au point. Ce qui me gène dans la deuxième solution, c est que l on sort le fichier de l exe, au lieu de tout garder en interne, mais elle fonctionne parfaitement, la preuve .

  10. #10
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Ca me gène aussi car le principe des ressources c'est de laissé empacter dans l'exe mais bon pour l'instant ca fonctionne, je verrais par la suite si je peux amélioré cela.

    Je fais pareil déjà pour un fichier texte.

  11. #11
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Dans le cas d'un fichier texte, ou d'une variable dont la composition est "statique" (pas de différence entre deux créations), tu peux la charger comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    TResourceStream *LangRes=new TResourceStream((int)HInstance,"LANG",RT_RCDATA);
        char *Lang = new char [LangRes->Size+1];
        LangRes->Read(Lang,LangRes->Size);
    Le Read permet de charger les octets dans la chaîne de caractère par exemple.
    Tu dois pouvoir faire pareil pour un TStringList (à tester),

  12. #12
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Ok merci

  13. #13
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Bon et bien me revoilà sur ce sujet après 2ans sur un problème qui avait été résolu mais maintenant que j'ai migré sous RAD Studio 2009, la méthode que tu m'a proposé ne fonctionne plus.

    Est-ce que quelqu'un saurais comment faire sous 2009

    Merci d'avance pour votre aide

  14. #14
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Je ne sais pas de quelle méthode tu parles, mais pour celle-ci, je n'ai pas de problème avec C++Builder 2010:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TResourceStream *Res = new TResourceStream((unsigned)HInstance, "IMAGEGIF", (System::WideChar *)RT_RCDATA);
    TMemoryStream *image = new TMemoryStream();
    //conversion de la ressource en TMemoryStream pour retrouver le même format enregistré
    Res->SaveToStream(image);
    image->Position = 0;
    //sauvegarde de l'image dans un fichier pour la recharger plus facilement
    image->SaveToFile("image1.gif");
    //supression de l'image et des variables
    Image1->Picture->LoadFromFile("image1.gif");
    DeleteFile("image1.gif");
    delete Res;
    delete image;
    N'oublie pas qu'avec les versions récentes de C++Builder tu peux ajouter des ressources en allant dans Project > Resources...
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  15. #15
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Au lieu de me basé sur ce qui avait été écrit avant, j'ai décider de le faire à ma manière et franchement j'aime bien ma manière sans passer par plusieurs stream et un fichier. Sans plus attendre, la voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TResourceStream *Res = new TResourceStream((unsigned)HInstance, "IMAGEGIF", (System::WideChar *)RT_RCDATA);
    TGIFImage *TempGif = new TGIFImage();
    TempGif->LoadFromStream(Res);
    Image1->Picture->Graphic = TempGif;
    delete TempGif;
    delete Res;
    Il faut bien sûr, cette en-tête:
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  16. #16
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    j'utilisais la première solution avec un fichier

    Mon problème était sur cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TResourceStream *Res = new TResourceStream((int)HInstance, "IMAGEGIF", RT_RCDATA);
    sur le RT_RCDATA qu'il ne reconnait plus sous 2009

    merci pour ta solution

    Ta deuxième solution est très intéressante aussi cela évite d'extraire la ressource dans un fichier

    Merci beaucoup

  17. #17
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    RT_RCDATA est défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define RT_RCDATA           MAKEINTRESOURCE(10)
    Et MAKEINTRESOURCE comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef UNICODE
    #define MAKEINTRESOURCE  MAKEINTRESOURCEW
    #else
    #define MAKEINTRESOURCE  MAKEINTRESOURCEA
    #endif // !UNICODE
    Donc, au lieu de faire un cast comme je l'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (System::WideChar *)RT_RCDATA
    Tu peux aller dans Project > Options.... Dans la section Directories and Conditionals il y a l'option _TCHAR maps to. Si tu changes à wchar_t ton RT_RCDATA va être l'équivalent de MAKEINTRESOURCEW(10)

    Par contre, en changeant cette option il y a des chances qu'il y ait un paquets de problèmes dans ton logiciel
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  18. #18
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Ok merci pour les infos

    J'ai fait le Cast comme tu l'a fait et cela fonctionne donc pour l'instant pour éviter les problèmes, je vais laisser comme ca

  19. #19
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Je reviens sur ce sujet car j'ai trouvé une façon de faire un peu plus général pour charger une image en ressource. Avec ma dernière technique j'utilisait directement TGIFImage, maintenant avec un objet TWICImage il est possible de charger a peu près n'importe quel type d'image. Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TResourceStream *Res = new TResourceStream((unsigned)HInstance, "IMAGEGIF", (System::WideChar *)RT_RCDATA);
    TWICImage *WicImg = new TWICImage();
    WicImg->LoadFromStream(Res);
    Image1->Picture->Graphic = WicImg;
    delete WicImg;
    delete Res;
    Voici l'enum qui vous donnes les différents formats supportés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum TWICImageFormat { wifBmp, wifPng, wifJpeg, wifGif, wifTiff, wifWMPhoto, wifOther };
    NOTE:
    TWICImage est seulement disponible sur Windows XP SP3 ou sur les systèmes d'exploitation de version supérieure, et dépend des composants d'exécution de DirectX.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

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

Discussions similaires

  1. Afficher tout type d'image (gif ,png, jpg...)
    Par jfb53 dans le forum C++Builder
    Réponses: 22
    Dernier message: 20/07/2005, 14h52
  2. Image GIF a fond transparent dans un formulaire ?
    Par Coquelicot dans le forum IHM
    Réponses: 4
    Dernier message: 25/10/2004, 12h08
  3. [Servlet][Deb]envoyer image gif sur le flux http
    Par ptitBoutchou dans le forum Servlets/JSP
    Réponses: 15
    Dernier message: 09/04/2004, 10h12
  4. Commande CONVERT : PDF 2 pages vers 2 images GIF
    Par snoop dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 18/02/2004, 10h20
  5. Réponses: 4
    Dernier message: 14/10/2003, 08h58

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