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)
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)
bonjour,
voici le principe sur un évènement onclick d'un bouton nomé BGetImages:
Evidemment, pour que ce soit transparent, il faudrait mettre ça par exemple dans l'évènement ondocumentcomplete du webbrowser
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;
cordialement
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.
Quand tu dis :
tu veux dire : tout ce qui est affiché dans la fenêtre du webbrowser. Autrement dit, pour une page html, tu veux un bitmap ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2toute l'image lue par le navigateur ...
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;
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.
Tu utilises
pour enregistrer l'image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 image1.Picture.saveTo(tonfichier);
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.
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 ?
Bonjour,
d'ou vient le 'b' dans la ligne en rouge ?
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;
merci
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 ?
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.
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)
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
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;
en ce qui concerne la position d'une image, on a :
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.
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;
a+
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.
Partager