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

 Delphi Discussion :

[D6][Windows 11 64 bits] Récupérer plusieurs formats d'images depuis le web


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 426
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 426
    Points : 1 326
    Points
    1 326
    Par défaut [D6][Windows 11 64 bits] Récupérer plusieurs formats d'images depuis le web
    Bonjour à toutes et à tous,

    J'essaye de récupérer des photos depuis le site Web et avec le format .jpg il n'y a pas de problème.

    Mais certaines photos ont d'autres formats comme .png, .bmp, .webp etc... et donc à l'utilisation une exception.

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if UrlDownloadToFile(nil, PChar(Edurl.Text), PChar(Ednom.text + '.jpg'), 0, nil) = 0 then
        Image1.Picture.LoadFromFile(Ednom.text + '.jpg');
    Si quelqu'un avait une idée merci d'avance.

    @+,

    cincap

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    En D6, un peu galère

    BMP, TBitmap
    JPEG, TJPEGImage + TBitmap
    PNG, TPNGImage + TBitmap
    Il faut les récupérer sur le net si tu les as pas, ce sont des convertisseurs de flux
    Tu as surement dans ton projet l'inclusion d'un convertisseur JPEG qui s'enregistre dans une section initialize car je pense que RegisterFileFormat existait déjà en D6.

    Enfin, est-ce que le TWICImage existe ?
    C'est l'API Windows qui gère des codecs genre le TIFF

    Reprise de Texte sur image JPEG ou Socket et envoi d'image
    Sur le forum traine un code C++ que j'avais écris
    Code cpp : 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
    TJPEGImage* DummyJPEg = new TJPEGImage();
      try
      {
        DummyJPEg->LoadFromFile("C:\\Dossier\\Fichier.JPEG");
     
        TJPEGImage* DummyBitmap = new TBitmap();
        try
        {
          DummyBitmap->Assign(DummyJPEg);
          DummyBitmap->Canvas->ScanLine...
        }
        __finally
        {
          delete DummyBitmap;
        }
      __finally
      {
        delete  DummyJPEg;
      }
    }


    En XE2,
    JPEG, PNG, ... sont gérés par le TPicture, donc tu peux utiliser Graphic

    Le TPicture utilise des classes héritant de TGraphic, une Factory utilise l'extension de l'image pour déterminer la classe a instancier recensée dans la Class Registry accessible via RegisterFileFormat

    Ce Graphic peut être assigné à un TBitmap par Assign
    Si tu veux gérer manuellement le type sans passer par TPicture, utilise TJPEGImage ou TPngImage, TGIFImage

    Ensuite pour les formats comme TIFF, il te faut une librairie externe ou utiliser TWICImage qui se comporte comme le TPicture mais c'est fois si ce n'est pas du code Delphi mais les API Windows Imaging Component (WIC)

    Après, tu as d'autres lib chez JEDI ou Graphic32 !
    certaines lib ajoutent via RegisterFileFormat de nouveau TGraphic pour des formats non gérés nativement ou remplacer la classe standard par une classes plus performante
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    alors, avec cette fonction il ne vas pas être possible de récupérer le type mime retourné par le serveur...

    par contre il est relativement facile d'identifier les fichiers d'après les premiers octets pour distinguer les différents formats.

    ensuite pour PNG et TIF tu peux utiliser GDIP, j'ai même fait une version compatible D5 6 7.

    pour Webp c'est plus sioux...encore qu'il faudrait tester car il semblerait que ce soit supporté
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    identifier les fichiers d'après les premiers octets
    Aussi surnommé Magic Numbers
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Sinon, tu peux aussi télécharger tout dans un dossier, avec un simple TWebBrowser.Navigate sur le dossier et tu as un aperçu de tes image gérées par l'OS

    Désolé, c'est en Delphi 10 et Indy 10 mais dans le même principe, j'ai codé programme qui lit une page principale indiquée en ligne de commande, cette page contient un lien, le programme lit chaque page liée et dans ces pages cherchent les images, par flemme je n'ai pas codé la récursivité de lien en lien, c'est un Bat qui lance le programme sur n pages principales , cela a déjà téléchargés plus de 5000 images issues de 200 pages (issue de 9 pages principales)
    WebDownload.zip
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 426
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 426
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    Désolé pour le contre temps mais toujours mes soins en 2022.

    Merci à tous de proposer vos explications.

    Entre temps avec ce code mais depuis un dossier sur le Pc, je charge une photo en .bmp, .jpg, .png mais forcément depuis le Web c'est plus difficile par contre avec le click droit Windows 11 permet plusieurs options pour télécharger une photo.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    var
      hClipBoard: Cardinal;   // Handle sur les données du presse papier
      lpData: Pointer;        // Pointeur sur les données du presse papier
      nCharCount: Cardinal;   // Nombre de caractère du chemin
      lpPath: array of Char;  // Le chemin
     
      image: TPicture;       // L'image correspondant au chemin contenue dans le presse papier
     
      lpExtension :string;
    begin
      _pic:= TPicture.Create;
     
      // Ouverture du presse papier
      if not OpenClipboard(Handle) then
      begin
        ShowMessage('Erreur lors de l''ouverture du presse papier');
        Exit;
      end;
     
      // Récupération d'un pointeur sur les données
      hClipBoard:= GetClipboardData(CF_HDROP);
      if hClipBoard <> 0 then
      begin
        // Blocage de la mémoire du presse papier
        lpData:= GlobalLock(hClipBoard);
        if lpData <> nil then
        begin
          // Test du nombre de chemins dans le presse papier
          if DragQueryFile(Integer(lpData), High(Cardinal), nil, 0) = 1 then
          begin
            // Récupération de la taille du chemin
            nCharCount:= DragQueryFile(Integer(lpData), 0, nil, 0);
            Inc(nCharCount);
     
            // Allocation d'un buffer de la taille du chemin
            SetLength(lpPath, nCharCount);
     
            // Récupération du chemin
            DragQueryFile(Integer(lpData), 0, PChar(lpPath), nCharCount);
     
            // Vérification de l'extension
           // if LowerCase(ExtractFileExt(PChar(lpPath))) = '.bmp' then
            // Vérification de l'extension
            lpExtension:= LowerCase(ExtractFileExt(PChar(lpPath)));
            if (lpExtension = '.bmp') or
               (lpExtension = '.png') or
               (lpExtension = '.gif') or
               (lpExtension = '.jpg') then
     
            begin
              // Chargement et mise en place de l'image
              _pic.LoadFromFile(PChar(lpPath));
              image1.Picture:= _pic;
     
              GlobalUnlock(hClipBoard);
              CloseClipboard;
            end
            else
            begin
              ShowMessage('Seuls les fichiers d''extension .bmp sont supportés');
              GlobalUnlock(hClipBoard);
              CloseClipboard;
            end;
          end
          else
          begin
            ShowMessage('Il y a pas qu''un chemin dans la presse papier');
            GlobalUnlock(hClipBoard);
            CloseClipboard;
          end;
        end
        else
        begin
          ShowMessage('Echec du lock de la mémoire du presse papier');
          CloseClipboard;
        end;
      end
      else
      begin
        ShowMessage('Pas de données CF_HDROP dans le presse papier');
        CloseClipboard;
      end;
    Je vais tester l'exemple de ShaiLeTroll et vous dirais quoi.

    Voila j'ai testé mais erreur sur erreur car je suis sous D6.

    @+,

    cincap

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour Cincap,

    tu veux télécharger et afficher une image de type quelconque depuis un site Web :

    - dont tu as l'Url (et donc le nom ;

    - ou bien après clic du bouton droit sur une image dans ton navigateur ?

    Pour télécharger un fichier connaissant son nom :

    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
    uses
      URLMon, ShellApi;
     
    function DownloadFile(SourceFile, DestFile: string): Boolean;
    begin
      try
        Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
      except
        Result := False;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
      // URL Location
      SourceFile = 'http://www.google.com/intl/de/images/home_title.gif';
      // Where to save the file
      DestFile = 'c:\temp\google-image.gif';
    begin
      if DownloadFile(SourceFile, DestFile) then
      begin
        ShowMessage('Download succesful!');
        // Show downloaded image in your browser
        ShellExecute(Application.Handle, PChar('open'), PChar(DestFile),
          PChar(''), nil, SW_NORMAL)
      end
      else
        ShowMessage('Error while downloading ' + SourceFile)
    end;
    Source

    après si tu as besoin, j'ai une fonction qui charge presque tous types d'images et qui l'affiche dans un TImage.

    A+
    Charly

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 426
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 426
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Charly910 merci de ton intervention, avec la variable "Urlmon", dans ma 1ère demande, je récupérai les fichiers .bmp et .jpg sans les connaitre mais en les nommant (Ednom.text) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    procedure TForm1.ButtonTestClick(Sender: TObject);
    begin
     if UrlDownloadToFile(nil, PChar(Edurl.Text), PChar(Ednom.text + '.jpg'), 0, nil) = 0 then
        Image1.Picture.LoadFromFile(Ednom.text + '.jpg');
    end;
    Sinon j'ai constaté sur Windows 11 (peut être sur les versions antérieures) que pour tous les autres formats avec le click droit sur l'image d'un site puis "copier l'image" la simple ligne copie tous les formats même .png et .webp.

    Et pour les afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Image1.Picture.Assign(Clipboard);
    Je ferme le topic et merci à tous.

    @+,

    cincap

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/07/2022, 10h30
  2. [Drupal] Plusieurs formats d'image pour un champ image
    Par stevensf dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 01/08/2014, 17h08
  3. [MySQL] [Booleen] Récupérer plusieurs champs de type BIT(1) d'une table MySQL
    Par Longrais dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/05/2009, 22h30
  4. Récupérer le format d'image à partir d'un BufferedImage
    Par Traroth2 dans le forum Graphisme
    Réponses: 2
    Dernier message: 20/06/2007, 13h14
  5. récupérer taille format poids image stocker
    Par jarod71 dans le forum Langage
    Réponses: 1
    Dernier message: 18/03/2007, 15h35

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