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 :

Sauvegarder une image (.GIF/.JPG) avec CppWebBrowser


Sujet :

C++Builder

  1. #1
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut Sauvegarder une image (.GIF/.JPG) avec CppWebBrowser
    Bonjour, je voudrais télécharger une image et la sauvegarder quelque part.

    Pour cela je pensais utiliser un CppWebBrower.

    J'arrive à afficher sans pb l'image avec la commande Navigate(URL); je peux également récupérer le contenu HTML ou texte, mais comment faire pour sauvegarder une image ?

    Merci
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 62
    Points : 46
    Points
    46
    Par défaut
    bin si tu as le contenu HTML de la page, en faisant une recherche sur la balise <img> tu dois pouvoir trouver l'URL de l'image qu'il n'y a plus qu'à télécharger.

    Mais comment récupéres tu le source HTML de la page web à partir du TCppWebBrowser ?

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonjour,

    réponse(s) dans la FAQ : http://c.developpez.com/faq/bcb/?pag...erlisterimages

    Eric

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 62
    Points : 46
    Points
    46
    Par défaut
    oups désolé, je l'avais raté celui-là

  5. #5
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Oui oui, pour récupérer le nom des images c'est pas un problème, je charge le code HTML de la page dans un TMemo, et par une recherche (AnsiPos et SubString) je récupère le http:\\www.adresseURL.com\nom_de_l'image.jpg

    J'ai justement utilisé une parti du FAQ ( la partie "Comment récupérer le corps d'une page web affichée ?").
    C'est plus long mais ca me permet de rechercher d'autres choses que des images en meme temps.

    Mais le problème est que je voudrais charger cette image pour la mettre dans un répertoire de mon disque dur maintenant.

    Comment faire pour CHARGER cette image (le fichier.JPG) ?
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  6. #6
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    tu peux:

    la télécharger (y a des posts la dessus avec urldownloadtofile,des composants, etc... )

    ou récuperer l'image dans le cache d'internet explorer et la copier ou tu veux.

    voila un pti exemple de recherche du fichier dans le cache
    avec l'API RetrieveUrlCacheEntryFile :

    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
     
    #include Wininet.h"
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            DWORD   dwEntrySize = 4096; // taille buffer
            String img_url = "http://news.google.fr/images/news_fr_fr.gif";
            String dest_path ="D:\Test";
     
            // initialisation de la struture d'information d'entree de cache
            LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
            lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
            lpCacheEntry->dwStructSize = dwEntrySize;
     
            // recherche de l'entree dans le cache
            bool trouve = RetrieveUrlCacheEntryFile(img_url.c_str(),lpCacheEntry,&dwEntrySize,0);
     
            if(trouve){
              String source_path =String(lpCacheEntry->lpszLocalFileName);
     
              if(FileExists(source_path))   //si le fichier existe...
              {
                   //...le copier
                   SHFILEOPSTRUCT FileOpStr;
                   ZeroMemory(&FileOpStr, sizeof(FileOpStr));
                   FileOpStr.hwnd = Application->Handle;
                   FileOpStr.wFunc = FO_COPY;
                   FileOpStr.pFrom = source_path.c_str();
                   FileOpStr.pTo= dest_path.c_str();
                   FileOpStr.fFlags=FOF_ALLOWUNDO;
                   SHFileOperation(&FileOpStr);
              }
            }
    }
    NB: requiert d'ajouter wininet.lib au projet.

    Mais bon la premiere solution est meilleure à mon avis car l'utilisateur peut avoir choisi de désactiver le cache.

  7. #7
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    ouuuuh ! ca me parrait intéressant ce urldownloadtofile, je connaissais pas ... je vais essayer cet aprèm. Merci à tous pour les infos en tout ca.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  8. #8
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    J'ai essayé la méthode UrlDownloadToFile, mais j'ai une erreur de linker :

    [Lieur Erreur] Unresolved external 'URLDownloadToFileA' referenced from D:\BC\PROJECTS\CITY_LOADER\UNIT1.OBJ

    En cherchant un peu dans ce que vous m'avez donnés tous les deux j'ai trouvé le conseil suivant :

    "en cas d'erreur de linkage, ajoute la librairie wininet.lib à ton projet"

    Comment ajouter ce .LIB à la compilation ?

    En turboC c'était en ligne de commande que ca se faisait si je me rappel bien mais en Borland C++ Builder j'ai jamais eu l'occasion de le faire.

    Merci de votre aide en tout ca



    Edit : même problème avec le code de la seconde méthode
    [Lieur Erreur] Unresolved external 'RetrieveUrlCacheEntryFileA' referenced from D:\BC\PROJECTS\UNIT1.OBJ
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  9. #9
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    il y a plusieurs methode pour downloader

    pour utiliser UrlDownloadToFile:
    il faut inclure le header "urlmon.h" et ajouter au projet "urlmon.lib" : Menu->projet->Ajouter au projet, Choisir *lib regarder dans C:\Program Files\Borland\CBuilder6\Lib\Psdk

    si tu rencontre quelques soucis après il y a un post là dessus :

    http://www.developpez.net/forums/vie...downloadtofile


    à ne pas confondre avec la methode InternetOpenUrl de Wininet : pareil il faut inclure wininet.h
    et àjouter au projet wininet.lib :
    il y a un post ici pour cette methode :

    http://www.developpez.net/forums/vie...downloadtofile

  10. #10
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Exact, c'était tout simple.

    Maintenant je compile sans problème, mais il y a un autre problème :

    Le fichier (qui existe bien sur le serveur) ne se charge pas. Le programme freeze comme si il essayait de charger mais aucun fichier n'est créé à la fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int a=URLDownloadToFile(0, "http://blablabla.fr/image.jpg", "d:\\a.jpg", 0, 0);
     
       AnsiString b="fini "+IntToStr(a);
       Application->MessageBox(b.c_str(), "Look", MB_OK);
    Un truc intéressant : si je remplace l'url par un fichier présent sur mon disque, ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    URLDownloadToFile(0, "file:///D:/blablabla/image.bmp", "d:\\a.jpg", 0, 0);
     
       AnsiString b="fini "+IntToStr(a);
       Application->MessageBox(b.c_str(), "Look", MB_OK);
    étrange.

    Qu'en penses-tu ?

    Merci pour ton aide en tout ca, c'est sympa
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  11. #11
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    YES YES YES, j'y ai passé toute la nuit mais j'ai trouvé.

    Le code marche sans aucun problème, en fait c'était simplement un problème de firewall qui était démarré sous une session différente et donc qui bloquait la connexion ... celle-là on me l'avait jamais faite encore ^^

    Merci à tous pour votre aide, je vais aimer utiliser URLDownloadToFile je crois

    Aller, bonne nuit :p

    Argol_Medusa
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  12. #12
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Juste parce que le but de BCB est plutôt d'utiliser des composants que de taper directement les API (quand c'est possible), une solution à base de TIdHTTP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TMemoryStream * myStream = new TMemoryStream();
    TIdHTTP1->Get("http://monserveur.com/monimage.jpeg", myStream);
    myStream->SaveToFile("monimage.jpeg");
    delete myStream;

  13. #13
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    mm intéressant aussi, pas besoin de lib externe donc ... je teste tout ca dès que j'ai 5 minutes.

    Merci,

    Argol
    Désolé, on savait pas que c'était impossible, alors on l'a fait

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

Discussions similaires

  1. sauvegarder une image traiter avec flash
    Par dawla123 dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 20/05/2008, 11h21
  2. Réponses: 1
    Dernier message: 13/05/2008, 19h46
  3. Sauvegarde une image jpeg avec la qualité
    Par morgan47 dans le forum VB.NET
    Réponses: 1
    Dernier message: 19/02/2007, 10h48
  4. Réponses: 3
    Dernier message: 09/11/2006, 17h05
  5. Réponses: 12
    Dernier message: 09/06/2006, 07h27

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