OVH Cloud OVH Cloud

Visualiser une image d'un site internet

8 réponses
Avatar
Fabien Gouverneur
Bonjour, c'est encore moi !

Cette fois la question est la suivante :
Soit un petit site internet, contenant une ou plusieurs images.
Soit une application light comportant une form et un contrôle winsock.

Comment je peut faire pour ouvrir une image, et la visualiser dans un
picturebox, sans avoir à la télécharger sur ma machine ?

Comme pour mon message précédant, je recherche une méthode simple et une
méthode propre et élégante.

Merci à tous et à toutes !

8 réponses

Avatar
Dave
Slt

Tu peux essayé cela

Global MaPageHtml As HTMLDocument
Global ImgHtml As HTMLImg
Global Image As Image
'
'Loop 'attend la fin du chargement pour continuer la procedure
Set MaPageHtml = FormX.brwWebBrowser.Document
'compte le nombre d'images dans la page
For ImgPage = 0 To (MaPageHtml.images.length - 1) 'boucle sur les images
'
Set ImgHtml = MaPageHtml.images.Item(ImgPage)
'
If Right(UCase(ImgHtml.src), 4) = ".JPG" Then
'
'Clique sur l'image
ImgHtml.Click
'
Do Until MaPageHtml.ReadyState = "complete"
DoEvents
Loop 'attend la fin du chargement pour continuer la procedure
endif
'
next ImgPage

"Fabien Gouverneur" a écrit dans le message de news:
43c38426$0$31572$
Bonjour, c'est encore moi !

Cette fois la question est la suivante :
Soit un petit site internet, contenant une ou plusieurs images.
Soit une application light comportant une form et un contrôle winsock.

Comment je peut faire pour ouvrir une image, et la visualiser dans un
picturebox, sans avoir à la télécharger sur ma machine ?

Comme pour mon message précédant, je recherche une méthode simple et une
méthode propre et élégante.

Merci à tous et à toutes !




Avatar
Fabien Gouverneur
"Dave" a écrit dans le message de
news:dq02ps$h2m$
Slt

Tu peux essayé cela

Global MaPageHtml As HTMLDocument
Global ImgHtml As HTMLImg
Global Image As Image
'
'Loop 'attend la fin du chargement pour continuer la procedure
Set MaPageHtml = FormX.brwWebBrowser.Document
'compte le nombre d'images dans la page
For ImgPage = 0 To (MaPageHtml.images.length - 1) 'boucle sur les images
'
Set ImgHtml = MaPageHtml.images.Item(ImgPage)
'
If Right(UCase(ImgHtml.src), 4) = ".JPG" Then
'
'Clique sur l'image
ImgHtml.Click
'
Do Until MaPageHtml.ReadyState = "complete"
DoEvents
Loop 'attend la fin du chargement pour continuer la procedure
endif
'
next ImgPage



Merci, mais cela m'oblige à embarqué un composant webbrowser avec mon outil,
en plus des autres composant déjà utilisé.
Je préfererais limité le nombre de composant au minimum, c'est pour cela que
je voudrais utiliser winsock.

Je sais déjà récupérer le flux d'un fichier de type texte dans une variable
ou un tableau, je suppose que cela fonctionne sur le même pricipe, mais ce
que je ne sais pas faire c'est de cette variable ou ce tableau, faire
reconnaitre a vb qu'il s'agit d'une image.
Avatar
Fred
Dans : news:43c38426$0$31572$,
Fabien Gouverneur disait :
Bonjour, c'est encore moi !



Bonjour,


Cette fois la question est la suivante :
Soit un petit site internet, contenant une ou plusieurs images.
Soit une application light comportant une form et un contrôle winsock.

Comment je peut faire pour ouvrir une image, et la visualiser dans un
picturebox, sans avoir à la télécharger sur ma machine ?



Sans la télécharger cela me paraît difficile :-)

Comme pour mon message précédant, je recherche une méthode simple et
une méthode propre et élégante.




Quelques pistes de recherches car je n'ai pas mis cela en ½uvre mais,
compte tenu de tes impératifs, voilà comment je procéderais.

Se connecter sur le port 80 du serveur avec ton winsock.
Lui envoyer une requête http GET qui demande l'image.
En retour tu dois récupérer une trame dont le corps doit contenir ton
image encodée en base 64.
Après conversion en tableau de Bytes, cela doit pouvoir alimenter un
picture box ? En fait, si j'ai bien compris, tu ne veux pas
l'enregistrer temporairement sur le disque, c'est cela ?

Regarde sur le site de Jean-Marc (m'étonne qu'il n'ai déjà répondu ;-) )
http://myjmnhome.dyndns.org/
Il a programmé un serveur web et les sources sont disponibles.
En voyant comment le serveur envoie les images, tu pourras facilement
voir comment les récupérer.


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Jean-Marc
"Fred" a écrit dans le message de
news:
Dans : news:43c38426$0$31572$,
Fabien Gouverneur disait :
> Bonjour, c'est encore moi !

Bonjour,


> Cette fois la question est la suivante :
> Soit un petit site internet, contenant une ou plusieurs images.
> Soit une application light comportant une form et un contrôle


winsock.
>
> Comment je peut faire pour ouvrir une image, et la visualiser dans


un
> picturebox, sans avoir à la télécharger sur ma machine ?

Sans la télécharger cela me paraît difficile :-)

> Comme pour mon message précédant, je recherche une méthode simple et
> une méthode propre et élégante.


Quelques pistes de recherches car je n'ai pas mis cela en ½uvre mais,
compte tenu de tes impératifs, voilà comment je procéderais.

Se connecter sur le port 80 du serveur avec ton winsock.
Lui envoyer une requête http GET qui demande l'image.
En retour tu dois récupérer une trame dont le corps doit contenir ton
image encodée en base 64.
Après conversion en tableau de Bytes, cela doit pouvoir alimenter un
picture box ? En fait, si j'ai bien compris, tu ne veux pas
l'enregistrer temporairement sur le disque, c'est cela ?

Regarde sur le site de Jean-Marc (m'étonne qu'il n'ai déjà répondu


;-) )
http://myjmnhome.dyndns.org/
Il a programmé un serveur web et les sources sont disponibles.
En voyant comment le serveur envoie les images, tu pourras facilement
voir comment les récupérer.



Hello :-)

En fait les images sont servies comme tous les autres types
MIME, je fais une simple lecture binaire du fichier à envoyer
et je l'envoie précédé du type MIME correspondant.
Voici un extrait du code:

' yes, get the content
Open G_Root_Path & page For Binary As #f
size = LOF(f)
img = String$(size, vbNullChar)
Get #f, , img
Close #f

' HTTP Header
sdata = sdata & "HTTP/1.0 200 OK" & vbCrLf
sdata = sdata & "Accept-Ranges: bytes" & vbCrLf
sdata = sdata & "Content-Length: " & size & vbCrLf
sdata = sdata & "Content-Type: " & ContentType & vbCrLf
' end header
sdata = sdata & vbCrLf
' concat the content
sdata = sdata & img
s = sdata
buildMIME = True

La variable ContentType est calculé en fonction de l'extension
du fichier, voici un extrait (content-type ; extension)
' 8<----------------------------
image/png;.png
image/gif;.gif
image/jpeg;.jpeg, .jpg, .jpe
' 8<----------------------------

Je ne fais pas de surencodage en base64, car ce n'est pas requis
par le protocole HTTP.

Pour faire des tests:
http://myjmnhome.dyndns.org/img/images10.jpg

depuis VB, faire sur le port 80 à l'adresse du serveur:

Winsock1.SendData "GET GET /img/images10.jpg HTTP/1.1" & vbCrLf


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jean-Marc
oups, un seul GET bien sur:

Winsock1.SendData "GET /img/images10.jpg HTTP/1.1" & vbCrLf


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Guy DETIENNE
Salut ;O)

Vois ici :
http://www.vbip.com/winsock/index.asp

Tu y trouveras tout sur Winsock et dans la partie "WWW and HyperText
Transfer Protocol" ce qui t'intéresse plus spécifiquement.

Guy

"Fabien Gouverneur" a écrit dans le message de
news:43c38426$0$31572$
Bonjour, c'est encore moi !

Cette fois la question est la suivante :
Soit un petit site internet, contenant une ou plusieurs images.
Soit une application light comportant une form et un contrôle winsock.

Comment je peut faire pour ouvrir une image, et la visualiser dans un
picturebox, sans avoir à la télécharger sur ma machine ?

Comme pour mon message précédant, je recherche une méthode simple et une
méthode propre et élégante.

Merci à tous et à toutes !




Avatar
Fred
Dans : news:43c40bd9$0$13560$,
Jean-Marc disait :

Hello :-)

En fait les images sont servies comme tous les autres types
MIME, je fais une simple lecture binaire du fichier à envoyer
et je l'envoie précédé du type MIME correspondant.
Voici un extrait du code:

' yes, get the content
Open G_Root_Path & page For Binary As #f
size = LOF(f)
img = String$(size, vbNullChar)
Get #f, , img
Close #f

' HTTP Header
sdata = sdata & "HTTP/1.0 200 OK" & vbCrLf
sdata = sdata & "Accept-Ranges: bytes" & vbCrLf
sdata = sdata & "Content-Length: " & size & vbCrLf
sdata = sdata & "Content-Type: " & ContentType & vbCrLf
' end header
sdata = sdata & vbCrLf
' concat the content
sdata = sdata & img
s = sdata
buildMIME = True



Je ne fais pas de surencodage en base64, car ce n'est pas requis
par le protocole HTTP.



Et oui, j'avais confondu. Il y a le Content-Length qui délimite les
données.
C'est moins compliqué comme cela pour Fabien.


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Jean-Marc
"Fred" a écrit dans le message de
news:
Dans : news:43c40bd9$0$13560$,
Jean-Marc disait :

> Hello :-)
>
> En fait les images sont servies comme tous les autres types
> MIME, je fais une simple lecture binaire du fichier à envoyer
> et je l'envoie précédé du type MIME correspondant.
> Voici un extrait du code:
>
> ' yes, get the content
> Open G_Root_Path & page For Binary As #f
> size = LOF(f)
> img = String$(size, vbNullChar)
> Get #f, , img
> Close #f
>
> ' HTTP Header
> sdata = sdata & "HTTP/1.0 200 OK" & vbCrLf
> sdata = sdata & "Accept-Ranges: bytes" & vbCrLf
> sdata = sdata & "Content-Length: " & size & vbCrLf
> sdata = sdata & "Content-Type: " & ContentType & vbCrLf
> ' end header
> sdata = sdata & vbCrLf
> ' concat the content
> sdata = sdata & img
> s = sdata
> buildMIME = True

> Je ne fais pas de surencodage en base64, car ce n'est pas requis
> par le protocole HTTP.

Et oui, j'avais confondu. Il y a le Content-Length qui délimite les
données.
C'est moins compliqué comme cela pour Fabien.



Je ne sais pas quelles sont les vraies contraintes de Fabien, mais si
je devais implémenter, je ne me ferais pas suer avec un socket et tout
le cirque que ça va être pour remettre les bytes dans le format correct
pour le picturebox (sans compter qu'il faudra gérer les différents types
de fichiers image) ...

Je ferais un simple download de l'image dans un fichier temporaire, et
hop, direct dans le picture box avec un petit bout de code comme ça:

Private Declare Function URLDownloadToFile Lib "urlmon" Alias
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String,
ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As
Long) As Long

Public Function DownloadFile(url As String, LocalFilename As String) As
Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, url, LocalFilename, 0, 0)
If lngRetVal = 0 Then DownloadFile = True
End Function

Quitte à détruire ensuite le fichier temporaire avec un petit Kill
bien senti. Vouloir le faire directement avec le socket ne sera ni
plus élégant ni plus rapide ni rien du tout. Ce sera juste pénible.

En plus avec Winsock, si le fichier est un peu gros, c'est plutot
lent, il vaut alors mieux utiliser directement les API sockets, mais
du coup c'est beaucoup plus compliqué. Bref, mon conseil: un simple
chargement de fichier, affichage, et destruction du fichier: simple,
souple, efficace et 10 lignes de code grand maximum.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;