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 :

webbrowser sauver en bitmap une image


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut webbrowser sauver en bitmap une image
    Supposons que je veuille (et ceci de façon transparante) sauver au format bitmap toutes les images d'une page web, je pourrais faire comment ?
    (la partie qui fait la sauvegarde de tout fichiers lu vers le bitmap me suffit)

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Par défaut
    bonjour,

    voici le principe sur un évènement onclick d'un bouton nomé BGetImages:

    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
     
     
    uses urlmon;
     
    function  saveimage(url, fic: string) : boolean;
    begin
         try
            Result := UrlDownloadToFile(nil, PChar(url), PChar(fic), 0,nil) = 0;
         except
               Result := False;
         end;
    end;
     
    procedure TForm1.BGetImagesClick(Sender: TObject);
    var
       nimage, p: Integer;
       urlimage, nomfic, path, ext: string;
    begin
         for nimage := 0 to WebBrowser1.OleObject.Document.Images.Length - 1 do
         begin
              urlimage := WebBrowser1.OleObject.Document.Images.Item(nimage).Src;
              p := LastDelimiter('.', urlimage);
              ext := UpperCase(Copy(urlimage, p + 1, Length(urlimage)));
              if (ext = 'GIF') or (ext = 'JPG') then
              begin
                   p  := LastDelimiter('/', urlimage);
                   path := ExtractFilePath(Application.ExeName);
                   nomfic := path + Copy(urlimage, p + 1,Length(urlimage));
                   saveimage(urlimage, nomfic);
              end;
         end;
    end;
    Evidemment, pour que ce soit transparent, il faudrait mettre ça par exemple dans l'évènement ondocumentcomplete du webbrowser

    cordialement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut
    Merci pour la réponse et bonjour à toi aussi.
    En fait il y a de l'idée mais il me sauve les images au format d'origine (j'ai testé sur un gif) cette solution me permet de remplir une de mes fonctions mais j'ai dejà mais une partie pour le téléchargement de fichiers tout court. C'est la partie conversion vers bitmap de toute image lue par le navigateur (c'est une option de IE) qui m'interesse, donc ca ne repond pas tout à fait à ma question.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Par défaut
    Quand tu dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toute l'image lue par le navigateur ...
    tu veux dire : tout ce qui est affiché dans la fenêtre du webbrowser. Autrement dit, pour une page html, tu veux un bitmap ?

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Si c'est l'image de tout le navigateur alors il te suffit de faire comme cela:

    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
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw,ActiveX;
     
    type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        Button2: TButton;
        Image1: TImage;
        Button3: TButton;
    procedure Button3Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1 : TForm1;
      img : Tbitmap;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      webBrowser1.navigate('http://www.developpez.com');
      img := TBitmap.Create;
      img.PixelFormat := pf24bit;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      ViewObject: IViewObject;
      sourceDrawRect: TRect;
    begin
     if webBrowser1.Document <> nil then
     try
        img.Width := WebBrowser1.Width;
        img.Height := WebBrowser1.Height;
        webBrowser1.Document.QueryInterface(IViewObject, ViewObject);
        if ViewObject <> nil then
        try
           sourceDrawRect := Rect(0, 0, b.Width, b.Height);
           ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,
           img.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
        finally
               ViewObject._Release;
        end;
     
    //Mise sous forme d'une bipmap toute la page
        Image1.Width:=WebBrowser1.Width;
        Image1.Height:=WebBrowser1.Height;
        Image1.Picture.Assign(img);
        Image1.Refresh;
     except
     end;
    end;

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut
    hmm en fait je ne veux pas faire un screenshot de la page web mais plutot faire un "enregistrer l'image sous" au format bitmap, sans passer par cette fonction du navigateur, mais par un programme delphi.
    Si l'image prend plus que la taille du navigateur alors, appliquer l'enregistrement à toute l'image.

  7. #7
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Tu utilises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    image1.Picture.saveTo(tonfichier);
    pour enregistrer l'image.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut
    oui mais la je le fais d'un Timage, non ?
    pas d'une image qui est dans un webbrowser ?

    (note pour comprendre ce que je veux faire prenez Internet explorer, mettez la souris sur une image, et faites clic droit, puis "enregistrer sous"
    ensutie selectionner "Bmp" (format qui devrait etre disponible tout le temps. Moi je veux faire la meme chose mais sans passer par le menu, une fois l'image chargée dans le webbrowser executer et sauver en bmp en une fois)
    Determiner l'image n'est pas un probleme.

  9. #9
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Définis avant tout pour toi ce que tu appelles Image. Car là, je ne te suis pas.
    Chaque images contenue dans la page affichée par le TWebBrouwser ou tout ce que l'on peut voir dans le TWebBrowser ?

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Par défaut
    Bonjour,

    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
    procedure TForm1.Button2Click(Sender: TObject);
    var
      ViewObject: IViewObject;
      sourceDrawRect: TRect;
    begin
     if webBrowser1.Document <> nil then
     try
        img.Width := WebBrowser1.Width;
        img.Height := WebBrowser1.Height;
        webBrowser1.Document.QueryInterface(IViewObject, ViewObject);
        if ViewObject <> nil then
        try
           sourceDrawRect := Rect(0, 0, b.Width, b.Height);
           ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,
           img.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
        finally
               ViewObject._Release;
        end;
    d'ou vient le 'b' dans la ligne en rouge ?

    merci

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut
    corrige et met img à la place

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Par défaut
    OK, avec ce système tu as une image de ce qui est affiché dans la fenêtre du twebbrowser, pas l'image de la totalité de la page sous-jacente. C'est ça ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut
    c'est ca, en revanche tu as une image de ce qui est affiché dans le webbrowser et si tu mets un bouton dessus ca ne t'affiche pas le bouton mais ce qui est dans le webbrowser.

    Enfin je comprends pas tres bien les operations et ce qu'elles font, donc c'est bricolable facilement mais je prefererais une solution plus elegante.
    Par ce moyen, je peux faire:

    - on determine la position d'une image donnée d'un un webbrowser et sa taille (si quelqu'un sait faire il m'arrange si il le poste)
    - on ajuste l'image au webbrowser (facile)
    - on deplace la scrollbar (facile)
    - on cache la scrollbar (facile)
    on fait le screenshot du webbrowser et on obtient un image en bmp.

    Ca peut servir de solution d'appoint pour convertir des images au format un peu special.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Par défaut
    pour la position d'une image, j'ai vu passé ça, je vais chercher.

    là, je suis parti dans la compréhension de ce qui se passe en débutant là :

    http://msdn.microsoft.com/library/de...ctIUnknown.asp

    sinon, je te rajoute une version qui sauve toute la page, même ce qui n'est pas dans la partie visible du twebbrowser. (attention, c'est aussi bricolage et ça ne restitue pas le composant dans son état inital)

    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
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
       Doc: IHTMLDocument2;
       body: OleVariant;
       totaleWidth,totaleHeight : integer;
       sourceDrawrect : TRect;
       sourceBitmap : TBitmap;
       viewobject : IViewObject;
    begin
         Doc := IHTMLDocument2(WebBrowser1.Document);
         body := Doc.Body;
         body.NoWrap := True;
     
         //cache les scrollbars
         body.Style.BorderStyle := 'none';
         body.Scroll := 'no';
     
         totaleWidth := body.ScrollWidth + body.LeftMargin + body.RightMargin;
         totaleHeight := body.ScrollHeight + body.TopMargin + body.BottomMargin;
         WebBrowser1.Width := totaleWidth;
         WebBrowser1.Height := totaleHeight;
     
          sourceDrawRect := Rect(0, 0, totaleWidth, totaleHeight);
          sourceBitmap := TBitmap.Create;
         try
            sourceBitmap.Width := totaleWidth;
            sourceBitmap.Height := totaleHeight;
     
            WebBrowser1.Document.QueryInterface(IViewObject, ViewObject);
            if ViewObject <> nil then
            try
               ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle, sourceBitmap.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
            finally
                   ViewObject._Release;
            end;
     
            sourceBitmap.SaveToFile('test.bmp');
            //image.Canvas.StretchDraw(image.ClientRect,sourceBitmap); si tu veux faire une miniature
     
         finally
                sourceBitmap.Free;
         end;
    end;
    a+

  15. #15
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Par défaut
    en ce qui concerne la position d'une image, on a :

    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
     
    function offsetleft(e : IHTMLElement) : integer;
    begin
         if e.offsetParent = nil then
         begin
              result := e.offsetLeft;
              exit
         end
         else result := e.offsetLeft + offsetleft(e.offsetParent);
    end;
     
    function offsettop(e : IHTMLElement) : integer;
    begin
         if e.offsetParent = nil then
         begin
              result := e.offsettop;
              exit
         end
         else result := e.offsettop + offsettop(e.offsetParent);
    end;
     
    procedure testposition;
    var
       x, px, py : integer;
       doc : IHTMLDocument2;
       e : IHTMLElement;
    begin
           doc := WebBrowser1.Document as IHtmlDocument2;
           // on balaye les images
           for x:=0 to WebBrowser1.OleObject.Document.images.length-1 do
           begin
                  e := Doc.Images.Item(x, 0) as IHTMLElement;
                  px := offsetleft(e); // position en x
                  py := offsettop(e); // position en y
            end;
    end;
    les positions e.offsetleft et e.offsettop sont données par rapport à l'élément parent. Si on veut la position dans la page, il faut appelé récurcivement.

    a+

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Par défaut
    Merci à toi, j'essaierais ca demain.
    C'est bizare que je n'arrive j'ai remarqué dans la doc de microsoft que l'on pouvait appeler des fonctions de cette manière
    http://www.talkaboutsoftware.com/gro...ages/3831.html
    avec un OLECMDID et ca IDM_SAVEPICTURE 2270

    (ca vient d'un header c++)

    il n'y a pas pas de code source qui commande shdoclc.dll sous delphi ?


    enfin mon message n'est plus tres clair mais je pense que certains doivent comprendre quel est le concept que je veux utiliser.

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/12/2004, 11h00
  2. Comment copier un bitmap d'une image à une autre?
    Par gord's dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2003, 13h07
  3. generer une image bitmap a partir d'une scene OGL
    Par FreshLog dans le forum OpenGL
    Réponses: 4
    Dernier message: 01/07/2003, 11h29
  4. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01

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