none
Comment avec webBrowser, auto-adapter l'image à la taille de la form ? RRS feed

  • Question

  • Bonjour,

    J'ai un petit problème avec les images qui n'ont pas toutes la même taille, comment faire pour les adapter (adapter leur taille) à celle de la form (ce qu'affiche le webBrowser), par exemple j'ai un zoom manipulé avec une HSscrollBarre :

    Form3.WebBrowser1.ActiveXInstance.ExecWB(63, 0, CInt(HScrollBar1.Value))
    

    Mais justement je vourdrais éviter de changer sans cesse manuellement la taille du zoom, qu'en faite il puisse devenir automatique en somme, affichant au maxi l'image selon la form qui visualise, savez-vous comment faire ?

    Merci, cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    dimanche 13 février 2011 04:33

Réponses

  • Bonjour Ehjoe,

    1. Alors déjà il n'est certes pas utile de tester toutes les images potentielles, mais je trouve ce moyen d'accès pas trop mauvais. D'ailleurs au final ça ne change pas grand chose, car la boucle s'arrête au premier élément.

    En fait là on parle uniquement de lien direct d'une image, et non d'une page .html ou autre contenant 1 ou plusieurs image(s). La boucle ne pose donc pas de gros problèmes de temps ou autre.

    Si on veut vraiment se passer de la boucle on peut changer les boucles qui ressemblent plus ou moins à  :

     

     For Each elements In WB.Document.GetElementsByTagName("img")
    
       elements.SetAttribute("width", WB.Width - 40)
       elements.SetAttribute("height", WB.Height - 40)
    
       WB.Document.Body.AppendChild(elements)
    
     Next
    

    par :

     

     Dim element As System.Windows.Forms.HtmlElement = WB.Document.All.Item(4)
       
       element.SetAttribute("width", WB.Width - 40) 
       element.SetAttribute("height", WB.Height - 40)
    
     WB.Document.Body.AppendChild(element)
    

    En effet Item(4) donne la balise IMG (0 = html, 1 = head, 2 = title, 3 = body, 4 = img).

    Alors bon ça fait plus propre, mais je ne suis pas sûr que cela s'applique à toutes les pages !

    Je ne pense pas avoir besoin de recopier tout le code ? Il suffit de remplacer les boucles par ce que j'ai cité juste au dessus.

    2. Je pensais qu'au lieu d'ennuyer l'utilisateur avec une MsgBox ou autre, on teste tout simplement si il navigue vers une image, et si ce n'est pas le cas, on ne fait rien.

    Pour tester si on navigue vers une image il existe à nouveau plusieurs façon de procéder dont celle que j'ai donnée hier :

     If WebBrowser1.Url.AbsoluteUri.EndsWith("jpg") Or WebBrowser1.Url.AbsoluteUri.EndsWith("png") Or WebBrowser1.Url.AbsoluteUri.EndsWith("bmp") _
        Or WebBrowser1.Url.AbsoluteUri.EndsWith("gif") Then 'si on navigue vers une image
       
    
       AdapterImage(WebBrowser1) 'on adapte l'image
     
      End If
    

    3. Je ne pense pas qu'un problème se pose si l'image est de la même taille du webbrowser. Il faudrait peut-être tester, mais de toute manière on sera dans notre "Else" (image plus petite) et le redimensionnement sera quand même fait. J'ai noté "sinon, si l'image est plus petite" mais c'est plutôt "sinon, si l'image est plus petite ou égale à la taille du WB".

    4. Je n'ai pas bien compris. Le ratio est gardé (à qqes centièmes près..) lorsqu'on souhaite garder les proportions. Je ne trouve pas les images déformées.

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    • Marqué comme réponse EhJoe mercredi 23 février 2011 03:20
    mardi 22 février 2011 13:44
  • Bonjour Michel,

    Suite après le code (un peu remanié) :

    Sub WebBrowser1_DocumentCompleted_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
      Dim nouvelleLargeur, nouvelleHauteur As Integer ' trouvé
      Dim element As System.Windows.Forms.HtmlElement = WebBrowser1.Document.All.Item(4)
      Dim t As Rectangle = WebBrowser1.Document.Images.Item(0).ClientRectangle ' dim img
      Dim cas As String = "++"
      If t.Width < WebBrowser1.Width Or t.Height < WebBrowser1.Height And WebBrowser1.Width <= WebBrowser1.Height Then cas = "-x"
      If t.Width < WebBrowser1.Width Or t.Height < WebBrowser1.Height And WebBrowser1.Width > WebBrowser1.Height Then cas = "-y"
      Select Case cas
       Case "++"
        nouvelleLargeur = t.Width * WebBrowser1.Height / t.Height
        nouvelleHauteur = t.Height * WebBrowser1.Width / t.Width
        If nouvelleLargeur > WebBrowser1.Width Then nouvelleLargeur = WebBrowser1.Width
        If nouvelleHauteur > WebBrowser1.Height Then nouvelleHauteur = WebBrowser1.Height
       Case "-x"
        nouvelleLargeur = WebBrowser1.Width
        nouvelleHauteur = t.Height * nouvelleLargeur \ t.Width
        nouvelleHauteur = (t.Height * nouvelleLargeur) \ t.Width
       Case "-y"
        nouvelleLargeur = (t.Width * WebBrowser1.Height) \ t.Height
        nouvelleHauteur = t.Height * nouvelleLargeur \ t.Width
        nouvelleHauteur = WebBrowser1.Height
      End Select
      element.SetAttribute("width", nouvelleLargeur - 30)
      element.SetAttribute("height", nouvelleHauteur - 17)
      Timer1.Enabled = False
      zoomOk = True
     End Sub
    

    En effet le ratio n'est pas utile car tu le fais en écrivant une double opératipon de conversion.

    J'ai enlevé la ligne qui suit, car je n'ai pas compris son utilité ?

    WebBrowser1.Document.Body.AppendChild(element)
    
    

    Bon, ben après tout ça, a priori c'est terminé, alors je ne peux que te remercier du fond du coeur pour ton aimable participation, toutefois, je crois que la prochaîne fois, si possible je prendrai une pcitureBox qui peut faire sensiblement la même chose, mais dont les directives sont connues facilement en français, elles ...

    Très cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse EhJoe mercredi 23 février 2011 03:20
    mercredi 23 février 2011 03:19

Toutes les réponses

  • Bonjour EhJoe,

    Peut-être qu'un composant WebBrowser existe pour ce type d'ajustement mais je n'ai rien trouvé pour le moment.

    Par contre en bricolant un peu on arrive à ajuster l'image au WebBrowser peu importe la taille.

    J'utilise cette image pour tester : http://www.chachatelier.fr/programmation/images/mozodojo-original-image.jpg

    Voila la démonstration :

    http://img109.imageshack.us/img109/5913/webbrowserimage.gif

    Et le code tel quel :

    Imports System.ComponentModel
    
    Public Class Form1
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        WebBrowser1.Navigate("http://www.chachatelier.fr/programmation/images/mozodojo-original-image.jpg")
    
      End Sub
    
      Dim rappel As New Image.GetThumbnailImageAbort(AddressOf rappelIcone) 'ne sera pas utilisé..
    
      Public Function rappelIcone() As Boolean
        Return False 'on pouvait ne rien mettre
      End Function
    
      Function QuelFormat(ByVal format As String) As System.Drawing.Imaging.ImageFormat 'renvoie le ImageFormat correspond pour la sauvegarde
        Select Case format
          Case "jpg"
            Return Imaging.ImageFormat.Jpeg
          Case "png"
            Return Imaging.ImageFormat.Png
          Case "bmp"
            Return Imaging.ImageFormat.Bmp
          Case "gif"
            Return Imaging.ImageFormat.Gif
          Case Else
            Throw New Exception("Format d'image inconnu")
        End Select
      End Function
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
    
        Dim lien As String = WebBrowser1.Url.AbsoluteUri 'on obtient le lien actuel 
        Dim formatImage As String = lien.Substring(lien.Length - 3, 3) 'récupère l'extension
    
        Dim clientWeb As New Net.WebClient 'on va télécharger le fichier en local (il y a surement mieux a faire..avec memorystream par exemple)
        clientWeb.DownloadFile(lien, IO.Path.GetTempPath & "imagetemporaire." & formatImage) 'on sauvegarde l'image avec son extension
        clientWeb.Dispose()
    
        'on crée une nouvelle image à partir du lien visité
        Dim image As System.Drawing.Image = image.FromFile(IO.Path.GetTempPath & "imagetemporaire." & formatImage)
    
        'on crée une miniature de cette image
        'note : le webbrowser met un bord blanc autour de l'image.. je n'ai pas trouvé comment le retirer 
        'donc en ajustant (comme ici avec -40) on arrive à centrer l'image et éviter les scrollbars
        image = image.GetThumbnailImage(WebBrowser1.Width - 40, WebBrowser1.Height - 40, rappel, System.IntPtr.Zero)
    
        image.Save(IO.Path.GetTempPath & "imagetemporaire2." & formatImage, QuelFormat(formatImage))
        image.Dispose()
    
        WebBrowser1.Navigate(IO.Path.GetTempPath & "imagetemporaire2." & formatImage)
    
        'on peut éventuellement supprimer l'image à la fin (File.Delete(..))
    
      End Sub
    End Class
    
    L'image sera agrandie ou réduite en fonction de sa taille ainsi que celle du webbrowser.

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    dimanche 13 février 2011 14:43
  • Bonsoir Michel,

    Merci, je vais voir dès que j'ai le temps, par contre ton exemple vidéo, la terre pour moi est applatie, ovale, ça dépend peut être de la définition de chacun, car les écran sont de plus en plus larges mais les pixels restent presque au même nombre alors ça va finir par être des traits ...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    dimanche 13 février 2011 17:53
  • Oui en effet l'image est redimensionnée pour correspondre à la taille du WebBrowser sans tenir compte des proportions.

    Voici la version avec prise en compte des proportions : (la terre ne sera plus aplatie cette fois)

     

    Imports System.ComponentModel
    
    Public Class Form1
    
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
      WebBrowser1.Navigate("http://www.chachatelier.fr/programmation/images/mozodojo-original-image.jpg")
      
     End Sub
    
     Function QuelFormat(ByVal format As String) As System.Drawing.Imaging.ImageFormat 'renvoie le ImageFormat correspond pour la sauvegarde
      Select Case format
       Case "jpg"
        Return Imaging.ImageFormat.Jpeg
       Case "png"
        Return Imaging.ImageFormat.Png
       Case "bmp"
        Return Imaging.ImageFormat.Bmp
       Case "gif"
        Return Imaging.ImageFormat.Gif
       Case Else
        Throw New Exception("Format d'image inconnu")
      End Select
     End Function
     Dim formatImage As String
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      
    
      Dim lien As String = WebBrowser1.Url.AbsoluteUri 'on obtient le lien actuel 
      formatImage = lien.Substring(lien.Length - 3, 3) 'récupère l'extension
    
      Dim clientWeb As New Net.WebClient 'on va télécharger le fichier en local (il y a surement mieux a faire..avec memorystream par exemple)
      clientWeb.DownloadFile(lien, IO.Path.GetTempPath & "imagetemporaire." & formatImage) 'on sauvegarde l'image avec son extension
      clientWeb.Dispose()
    
      'on crée une nouvelle image à partir du lien visité
      Dim image As System.Drawing.Image = image.FromFile(IO.Path.GetTempPath & "imagetemporaire." & formatImage)
      AdapterImage(IO.Path.GetTempPath & "imagetemporaire." & formatImage, IO.Path.GetTempPath & "imagetemporaire2." & formatImage, WebBrowser1.Width, WebBrowser1.Height - 40, True)
    
      WebBrowser1.Navigate(IO.Path.GetTempPath & "imagetemporaire2." & formatImage)
    
      'on peut éventuellement supprimer l'image à la fin (File.Delete(..))
    
     End Sub
     Public Sub AdapterImage(ByVal ImageOrigine As String, ByVal NouvelleImage As String, ByVal NouvelleLargeur As Integer, ByVal HauteurMax As Integer, ByVal RedimensionSiPlusLarge As Boolean)
    
      Dim imagePleineTaille As System.Drawing.Image = System.Drawing.Image.FromFile(ImageOrigine)
    
      If RedimensionSiPlusLarge Then
       If imagePleineTaille.Width <= NouvelleLargeur Then
        NouvelleLargeur = imagePleineTaille.Width
       End If
      End If
    
      Dim nouvelleHauteur As Integer = imagePleineTaille.Height * NouvelleLargeur \ imagePleineTaille.Width
      If nouvelleHauteur > HauteurMax Then
       ' on redimensionne 
       NouvelleLargeur = imagePleineTaille.Width * HauteurMax \ imagePleineTaille.Height
       nouvelleHauteur = HauteurMax
      End If
    
      Dim nouvelleImage_ As System.Drawing.Image = imagePleineTaille.GetThumbnailImage(NouvelleLargeur, nouvelleHauteur, Nothing, IntPtr.Zero)
    
    
      imagePleineTaille.Dispose()
    
      'on sauvegarde l'image redimensionnée
      nouvelleImage_.Save(NouvelleImage, QuelFormat(formatImage))
     End Sub
    End Class

     


     

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    dimanche 13 février 2011 18:34
  • Bonjour Michel,

    Merci beaucoup de l'attention portée à ma question, j'ai toujours du mal à suivre (webbrowser) et la matrice graphique que je ne connaissais ps sous vb6, ha...

    Je me demande si on ne peut pas faire la chose suivante, schéma de principe dressé de tête :

    Public Xw as long = width.webbrowser1
    Public Yw as long = height.webbrowser1
    picturebox1.visible = false
    '
    sub zoomage()
     ' chargement webbrowser ...
     if webbrowser1.image = vide then exit sub
     picturebox1.image = imageDuWebbrowser1 ' ?
     if formatImage = pas bon then exit sub
     dim ratio as double
     ratio = 100 / Yw * pictureBox1.height
     picturebox1.width = picturebox1.width * ratio
     picturebox1.height = picturebox1.height * ratio
     if picturebox1.width > Xw then
      ratio = 100 / Xw * pictureBox1.width
      picturebox1.width = picturebox1.width * ratio
      picturebox1.height = picturebox1.height * ratio
     end if
     webbrowser1.lance.picturebox1.image
    end sub

    En corrigeant les directives qu'il manque, est-ce que ça ne pourraît pas faire l'affaire ?

    Au plaisir de te lire, cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Modifié EhJoe lundi 14 février 2011 10:55 Rajout 1
    lundi 14 février 2011 10:49
  • Bonjour,

     

    Vu que c'est une page internet (Webrowser) il y a certainement un moyen de redimensionner les valeurs de l'image afficher (appeler aussi injection HTML)

    Le site affiche plusieurs image ?
    ou c'est que l'affichage d'une image depuis le web ?

    Dans les deux cas cela ne devrais pas être sorcier a faire avec le controle WebBrowser, soit mettre des balise HTML si c'est juste une image ou alors modifier les affichages si les balises HTML existe déjà

    il y a aussi un exemple dans les 101 exemples VB avec WebResquet qui récupérer les images directement dans une listview

     

    A bientot


    Cordialement, Troxsa
    lundi 14 février 2011 13:22
    Auteur de réponse
  • Bonjour,

    @EhJoe, Cette procédure revient plus ou moins à ce que j'ai indiqué à cela près que le WebBrowser ne contient pas de propriété Image et donc le test : "If WebBrowser.Image = Nothing" ne peut pas être réalisé. De plus il faudrait dans ce cas placer une Picturebox en plus du WebBrowser (?) , et donc, il faudrait d'abord sauvegarder l'image de la Picturebox sur l'ordinateur pour ensuite naviguer vers le chemin de cette image sauvegardée (car le WebBrowser ne sait pas ouvrir une image directement).

    D'autre part tout dépend des images à afficher (leurs tailles et nombres) car à la base le WebBrowser n'est pas optimisé pour cette tâche, et d'autant moins si sa taille dans le programme final est petite. Peut-être, au final, qu'une meilleure solution serait de détecter une image et de proposer un mode plein écran ?

     

    @TroXsA, Oui j'ai également pensé à cette manière qui serait de modifier les pages web à la volée selon ce que l'on souhaite faire. Le problème c'est la diversité des images/sites etc... qu'il y a sur le net qui rendent la tâche difficile au final car tel ou tel code injecté ne fonctionnera que pour tel ou tel site.

     

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    lundi 14 février 2011 15:17
  • @Michel K, Je connais pas tres bien le HTML, les Balise HTML pour les images ne sont pas les mêmes ? Il me semble que si ? (enfin je sais pas trop)

     

    A bientôt


    Cordialement,
    Xavier
    Alias Troxsa
    lundi 14 février 2011 16:49
    Auteur de réponse
  • @Xavier,

    En temps normal on a quelque chose du genre :

    <img src ="image.jpg">

    mais il y a tellement de possibilités comme "http://www.site.fr/dossier/image.jpg" à la place de "image.jpg" ou encore d'autres attributs peuvent s'ajouter comme width (quoi que ce dernier nous serait utile en fin de compte) ce qui nous force à adapter ce que l'on va injecter mais aussi la fonction elle même pour récupérer les liens.

    Enfin, peut-être que c'est faisable après tout, mais je doute que ce soit plus facile que l'exemple donné hier.


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    lundi 14 février 2011 16:57
  • L'idée de base que j'avais est du même style que vous avez donner pour les balises images "<img ...." c'est de lire toute les balise qui contienne "<img ...." et de voir si y a un width de lui changer la valeur, si y en a pas en ajouté un ...

    mais c'est peut etre sur que niveau code c'est peut etre plus prise de tete que de faire comme vous avez fait ...


    Cordialement,
    Xavier
    Alias Troxsa
    lundi 14 février 2011 17:19
    Auteur de réponse
  • Michel,

    Ben ça ne marche pas en fait, l'image n'est plus aplatie mais ne change pas de taille, quelle que soit celle du webbrowser, voici le code dont une erreur se produit au second click sur le bouton (voir à Try)

    Option Explicit On
    Imports System.ComponentModel
    
    Public Class Form1
     Dim formatImage As String
    
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      WebBrowser1.Navigate("http://www.chachatelier.fr/programmation/images/mozodojo-original-image.jpg")
     End Sub
    
     Function QuelFormat(ByVal format As String) As System.Drawing.Imaging.ImageFormat
      'renvoie l'ImageFormat correspond pour la sauvegarde
      Select Case format
       Case "jpg" : Return Imaging.ImageFormat.Jpeg
       Case "png" : Return Imaging.ImageFormat.Png
       Case "bmp" : Return Imaging.ImageFormat.Bmp
       Case "gif" : Return Imaging.ImageFormat.Gif
       Case Else : Throw New Exception("Format d'image inconnu")
      End Select
     End Function
    
     Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim lien As String = WebBrowser1.Url.AbsoluteUri 'on obtient le lien actuel 
      formatImage = lien.Substring(lien.Length - 3, 3) 'récupère l'extension
      Dim clientWeb As New Net.WebClient
      'on va télécharger le fichier en local (il y a surement mieux a faire..avec memorystream par exemple)
      Try
       clientWeb.DownloadFile(lien, IO.Path.GetTempPath & "imagetemporaire." & formatImage)
      Catch ex As Exception
       MsgBox("erreur" & vbLf & Err.Number & vbLf & Err.Description)
       ' au 2e click -> erreur 5 : une exception s'est produite lors de la demande client
      End Try
      'on sauvegarde l'image avec son extension
      clientWeb.Dispose()
      'on crée une nouvelle image à partir du lien visité
      Dim image As System.Drawing.Image = image.FromFile(IO.Path.GetTempPath & "imagetemporaire." & formatImage)
      AdapterImage(IO.Path.GetTempPath & "imagetemporaire." & formatImage, IO.Path.GetTempPath & "imagetemporaire2." & formatImage, WebBrowser1.Width, WebBrowser1.Height - 40, True)
      WebBrowser1.Navigate(IO.Path.GetTempPath & "imagetemporaire2." & formatImage)
      'on peut éventuellement supprimer l'image à la fin (File.Delete(..))
     End Sub
    
     Public Sub AdapterImage(ByVal ImageOrigine As String, ByVal NouvelleImage As String, ByVal NouvelleLargeur As Integer, ByVal HauteurMax As Integer, ByVal RedimensionSiPlusLarge As Boolean)
      Dim imagePleineTaille As System.Drawing.Image = System.Drawing.Image.FromFile(ImageOrigine)
      If RedimensionSiPlusLarge Then
       If imagePleineTaille.Width <= NouvelleLargeur Then
        NouvelleLargeur = imagePleineTaille.Width
       End If
      End If
      Dim nouvelleHauteur As Integer = imagePleineTaille.Height * NouvelleLargeur \ imagePleineTaille.Width
      If nouvelleHauteur > HauteurMax Then
       ' on redimensionne 
       NouvelleLargeur = imagePleineTaille.Width * HauteurMax \ imagePleineTaille.Height
       nouvelleHauteur = HauteurMax
      End If
      Dim nouvelleImage_ As System.Drawing.Image = imagePleineTaille.GetThumbnailImage(NouvelleLargeur, nouvelleHauteur, Nothing, IntPtr.Zero)
      imagePleineTaille.Dispose()
      'on sauvegarde l'image redimensionnée
      nouvelleImage_.Save(NouvelleImage, QuelFormat(formatImage))
     End Sub
    
    End Class
    
    
    

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 14 février 2011 18:56
  • Bonsoir Xavier,

    Ça ne récupère qu'une seule image, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 14 février 2011 18:58
  • Xavier,

    Il n'y a pas obligatoirement une taille à l'image "width, height", car l'image peut être d'origine plus petite ou plus grande que l'écran webbrowser ...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 14 février 2011 19:00
  • Bonsoir EhJoe,

    Oui en effet j'ai oublié de libérer l'image en ajoutant "image.Dispose()" voici la partie du code correspondante :

     Dim image As System.Drawing.Image = image.FromFile(IO.Path.GetTempPath & "imagetemporaire." & formatImage)
        AdapterImage(IO.Path.GetTempPath & "imagetemporaire." & formatImage, IO.Path.GetTempPath & "imagetemporaire2." & formatImage, WebBrowser1.Width, WebBrowser1.Height - 40, True)
        image.Dispose() 'ligne ajoutée
    
    Par contre c'est curieux, l'image s'adapte sans problème chez moi, les scrollbars restent activées ? Et l'image est visible en scrollant quelque soit la taille du Webbrowser ? (sauf si il est plus grand que l'image ?)

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    lundi 14 février 2011 19:37
  • Bonsoir,

    chez moi le code normalement aussi ! enfin j'ai pas d'erreur.

     


    Cordialement,
    Xavier
    Alias Troxsa
    lundi 14 février 2011 21:29
    Auteur de réponse
  • Michel,

    Je n'ai pas trouvé d'adresse email pour te contacter dans ton profile ou enpied, pas grave, voici le code à télécharger dans son dossier, tu verras :

    http://mesromans.free.fr/testJoe.zip

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 14 février 2011 22:41
  • EhJoe,

    Chez moi le code fonctionne toujours, meme celui que vous avez mis en lien ...

     


    Cordialement,
    Xavier
    Alias Troxsa My M@iL
    mardi 15 février 2011 12:07
    Auteur de réponse
  • Bonjour Xavier,

    Ce n'est pas qu'il ne fonctionne pas ce code, c'est que normalement l'immage devrait faire la taille exacte de la fenêtre du webbrowser, alors qu'elle ne fait rien de mon côté, elle ne change pas de taille, occupant environ le quart haut gauche.

    Est-ce que ton image zoome au maximum quand tun eppuies sur le bouton ?

    Merci, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 15 février 2011 13:18
  • Bonsoir EhJoe,

    En fait l'image était automatiquement adaptée à la taille du webbrowser lors de la première version (le premier code que j'ai donné) mais l'image était étirée.

    Ici, dans la deuxième version, si l'image est visible en taille réelle, le clic sur le bouton ne change rien car justement la taille est déjà "optimisée". Par contre si le webbrowser est plus petit que l'image, là elle sera redimensionnée afin de ne plus devoir scroller.

    Bon j'essaie de faire en sorte qu'il zoome au maxi l'image tout en gardant les proportions et je re posterai (par contre l'image risque d'être de piètre qualité avec un trop haut niveau de zoom).

    EDIT : voici la nouvelle procédure AdapterImage (remplacer l'ancienne par celle-ci) :

     Public Sub AdapterImage(ByVal ImageOrigine As String, ByVal NouvelleImage As String, ByVal NouvelleLargeur As Integer, ByVal HauteurMax As Integer, ByVal RedimensionSiPlusLarge As Boolean)
    
        Dim imagePleineTaille As System.Drawing.Image = System.Drawing.Image.FromFile(ImageOrigine)
        Dim nouvelleHauteur As Integer
    
        If imagePleineTaille.Width >= WebBrowser1.Width Or imagePleineTaille.Height >= WebBrowser1.Height Then
          If RedimensionSiPlusLarge Then
            If imagePleineTaille.Width <= NouvelleLargeur Then
              NouvelleLargeur = imagePleineTaille.Width
            End If
          End If
          If imagePleineTaille.Width < NouvelleLargeur Then
            If WebBrowser1.Width < WebBrowser1.Height Then
    
            End If
          End If
          nouvelleHauteur = imagePleineTaille.Height * NouvelleLargeur \ imagePleineTaille.Width
          If nouvelleHauteur > HauteurMax Then
            ' on redimensionne 
            NouvelleLargeur = imagePleineTaille.Width * HauteurMax \ imagePleineTaille.Height
            nouvelleHauteur = HauteurMax
          End If
    
    
    
        Else
          nouvelleHauteur = imagePleineTaille.Height * NouvelleLargeur \ imagePleineTaille.Width
    
          If WebBrowser1.Width <= WebBrowser1.Height Then
            NouvelleLargeur = WebBrowser1.Width
            nouvelleHauteur = (imagePleineTaille.Height * NouvelleLargeur) \ imagePleineTaille.Width
          Else
            nouvelleHauteur = WebBrowser1.Height 'ici il faut jouer avec -40 par exemple pour éviter l'affichage de la scrollbar..
            NouvelleLargeur = (imagePleineTaille.Width * nouvelleHauteur) \ imagePleineTaille.Height
    
          End If
    
        End If
    
        'on sauvegarde l'image redimensionnée
        Dim nouvelleImage_ As System.Drawing.Image = imagePleineTaille.GetThumbnailImage(NouvelleLargeur, nouvelleHauteur, Nothing, IntPtr.Zero)
        nouvelleImage_.Save(NouvelleImage, QuelFormat(formatImage))
        nouvelleImage_.Dispose()
    
      End Sub
    Il faut peut-être encore peaufiner un peu mais à première vue l'image est agrandie si elle est inférieure à la taille du Webbrowser et réduite si elle est supérieure (le tout avec le bon ratio hauteur/largeur, à cela près que les maths et moi ça fait plus que 2... d'ou le fait qu'une erreur là-dessus ne me surprendrait pas :) )


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    • Modifié Michel K mardi 15 février 2011 20:27 Rajout de la procédure.
    mardi 15 février 2011 19:49
  • Bonjour Michel, d'abord un grand merci.

    Ça ne marche pas car j'ai dû fraire une soupe avec toutes ces fonctions, peux-tu s'il te plaît avoir l'amabilité de me donner le code complet de telle façon que ça torune avec un copieé/collé ?

    En objet je n'ai donc plus qu'une form1 et un webBrowser1

    Tu as un if qui est vide, tu verras j'y ai mis des points d'interrogation

    Concernant le zoom, si c'est trop grand, j'ai un zoom qui permet de réduire, car je présume que ton code ne redimensionne qu'une seule fois l'image arrivant, qu'ensuite il n'interfère plus jusqu'à l'image (page) suivante ?

    Pour le code écrit dans une autre question "new" page afin d'éviter les popup, ben ça fonctionne mais il me semble trop bien, car parfois on a un tableau d'image puis on choisit par clique l'affichage d'une de ces images (new), et ton code bloque quelques fois cette action qui devrait rester libre, pas facile, je pense qu'il faudrait l'associer à une temporisation du genre (si ouverture venant de la feuille et non de mon click bouton met plus de 2/3 de seconde on refuse) et seulement dans ce cas.

    Je me rends compte que même les gens bien plus fort que moi en vbNet, dont toi évidemment, ont quand même du mal à en tirer quelque chose, j'avais mais raisons de ne pas aimer le webbrowser, c'est compliqué, mal documenté en français, pas assez, et non normalisé par rapport aux autre propriétés des objets (quand c'est possible), infernal ce truc.

    Voici le code que j'ai :

    Option Explicit On
    Imports System.ComponentModel
    
    Public Class Form1
     Dim formatImage As String
    
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      WebBrowser1.Navigate("http://www.chachatelier.fr/programmation/images/mozodojo-original-image.jpg")
     End Sub
    
     Function QuelFormat(ByVal format As String) As System.Drawing.Imaging.ImageFormat
      'renvoie l'ImageFormat correspond pour la sauvegarde
      Select Case format
       Case "jpg" : Return Imaging.ImageFormat.Jpeg
       Case "png" : Return Imaging.ImageFormat.Png
       Case "bmp" : Return Imaging.ImageFormat.Bmp
       Case "gif" : Return Imaging.ImageFormat.Gif
       Case Else : Throw New Exception("Format d'image inconnu")
      End Select
     End Function
    
     Public Sub AdapterImage(ByVal ImageOrigine As String, ByVal NouvelleImage As String, ByVal NouvelleLargeur As Integer, ByVal HauteurMax As Integer, ByVal RedimensionSiPlusLarge As Boolean)
      Dim imagePleineTaille As System.Drawing.Image = System.Drawing.Image.FromFile(ImageOrigine)
      Dim nouvelleHauteur As Integer
      If imagePleineTaille.Width >= WebBrowser1.Width Or imagePleineTaille.Height >= WebBrowser1.Height Then
       If RedimensionSiPlusLarge Then
        If imagePleineTaille.Width <= NouvelleLargeur Then NouvelleLargeur = imagePleineTaille.Width
       End If
       If imagePleineTaille.Width < NouvelleLargeur Then
        If WebBrowser1.Width < WebBrowser1.Height Then
         ' ???
        End If
       End If
       nouvelleHauteur = imagePleineTaille.Height * NouvelleLargeur \ imagePleineTaille.Width
       If nouvelleHauteur > HauteurMax Then
        ' on redimensionne 
        NouvelleLargeur = imagePleineTaille.Width * HauteurMax \ imagePleineTaille.Height
        nouvelleHauteur = HauteurMax
       End If
      Else
       nouvelleHauteur = imagePleineTaille.Height * NouvelleLargeur \ imagePleineTaille.Width
       If WebBrowser1.Width <= WebBrowser1.Height Then
        NouvelleLargeur = WebBrowser1.Width
        nouvelleHauteur = (imagePleineTaille.Height * NouvelleLargeur) \ imagePleineTaille.Width
       Else
        nouvelleHauteur = WebBrowser1.Height 'ici il faut jouer avec -40 par exemple pour éviter l'affichage de la scrollbar..
        NouvelleLargeur = (imagePleineTaille.Width * nouvelleHauteur) \ imagePleineTaille.Height
       End If
      End If
      'on sauvegarde l'image redimensionnée
      Dim nouvelleImage_ As System.Drawing.Image = imagePleineTaille.GetThumbnailImage(NouvelleLargeur, nouvelleHauteur, Nothing, IntPtr.Zero)
      nouvelleImage_.Save(NouvelleImage, QuelFormat(formatImage))
      nouvelleImage_.Dispose()
     End Sub
    
    End Class
    
    Au plaisir, cordialement.

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 16 février 2011 06:38
  • Bonjour EhJoe,

    Alors oui en effet j'avais oublié d'enlever les deux If.. Il ne servent à rien ici, car j'ai finalement utilisé un autre moyen. En effet le code ici adapte simplement l'image au webbrowser, peu importe sa taille, puis n'y touche plus sauf si changement de taille du webbrowser (ou de l'image) et si on reclique sur le bouton bien entendu.

    J'utilise souvent le bouton pour montrer le fonctionnement mais là il faudrait, si je ne me trompe pas, et si c'est ce que vous souhaitez, repérer si une image est affichée et alors redimensionner via AdapterImage(); le tout selon la volonté de l'utilisateur.

    Pour l'anti pop-up, c'est bel et bien radical, à savoir toutes ouvertures dans une nouvelle fenêtre sera annulée. J'avais auparavant donné le code pour récupérer un lien ouvrant une nouvelle fenetre et l'afficher dans le webbrowser (je ne l'ai plus sous la main et de toute façon ici ce serait idiot car le webbrowser ouvrirait la pop-up).

    Alors si je comprends bien, la procédure pour réduire l'image est déjà faite ? il suffit maintenant d'agrandir dynamiquement l'image comme une fonction "zoom in" ?

    Je n'ai pas le code sous la main mais au pire j'enverrai ça ce soir.

    Sinon le webbrowser est certes assez difficile à cerner au début, mais je reste persuadé que rien n'est très dur et qu'on arrivera forcément à faire ce que l'on souhaite. On s'est juste mal compris quant à l'utilisation des fonctions de zoom. :)

     

     

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    mercredi 16 février 2011 10:54
  • Bonjour,

     

    Tout d’abord, un grand merci à Michel pour les informations apportées sur ce thread !

     

    EhJoe, n’oubliez pas de lui donner les points J et de marquer la réponse, si vous réussissez a l’implémenter dans votre application.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    jeudi 17 février 2011 11:18
  • Bonjour Alex,

    Je mets le plus de points possibles ...

    Oui, j'attend d'avoir le code au complet qui tourne et je l'inscris comme "réponse".

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 17 février 2011 23:47
  • Bonjour,

     

    EhJoe, est-ce que vous avez réussi d’implémenter la solution ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    lundi 21 février 2011 10:14
  • Bonjour Alex,

    Non,  en l'état je ne suis pas capable de le faire fonctionner, désolé .

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 21 février 2011 12:17
  • Bonjour EhJoe,

    Qu'est-ce qui ne fonctionne pas actuellement ?


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    lundi 21 février 2011 12:27
  • Bonjour Michel,

    Ben ton code, je ne sais comment l'utiliser, ni dans quel ordre, ni prendre quoi, ni le mettre où... Au début il y avait un code entier, mais il a eu des modifications  que tu n'as renvoyé que partiellement, tu me disais me répondre "ce soir", message du 16 février 2011 à 10h54 alinéa 5, alors moi j'attends :o)

    En fait pour qu'ensuite je comprenne l'idéal c'est une "procédure" unique, ainsi je peux la coller n'importe où, après il suffit de me dire à quel endroit l'appeler, c'e n'est qu'ensuite, quand ça tourne que je vais chercher à comprendre comment ça marche (sinon je ne peux pas), et le noter pour que dans un contexte un peu similaire je sache quoi mettre...
    Je présume que ta procédure doit petre appelé à partir de :

    WebBrowser1_DocumentCompleted_1 …
      call ta_procedure_retaille_image
    end sub

    J'ai fait des fichiers pour tester, ici :

    'Form3.WebBrowser1.Navigate("http://mesromans.free.fr/petit.jpg")
    'Form3.WebBrowser1.Navigate("http://mesromans.free.fr/grand.jpg")
    ' Form3.WebBrowser1.Navigate("http://mesromans.free.fr/maxi.jpg")
    'Form3.WebBrowser1.Navigate("http://mesromans.free.fr/large.jpg")

    Au plaisir, cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 21 février 2011 15:03
  • Bonsoir EhJoe,

    Bon, en fait tout ce que j'ai donné ici fonctionnerait, mais je trouve le tout pas assez souple (par ailleurs, dans WebBrowser1_DocumentCompleted c'est plus difficile que prévu car on devrait naviguer vers l'image redimensionnée, et donc relancer l'évènement WebBrowser1_DocumentCompleted indéfiniment...).

    Je suis donc reparti du début pour tout refaire autrement. Et ça a marché (ou en tout cas pour les images "petit" , "large" etc...ainsi que certaines autres). J'ai essayé de rendre la procédure la plus souple possible afin de choisir le WebBrowser affecté, l'agrandissement ou non si l'image est plus petite, ainsi que le choix de garder les proportions ou non.

    Le seul bémol comme je l'ai noté en commentaire est le fait que l'image a un bord blanc, ce qui rend l'image "plus grande" que la taille du WebBrowser lorsqu'on souhaite qu'elle soit identique. J'ai corrigé ça avec "-40" en attendant de trouver une solution.

    Voici donc la procédure qu'il suffit de copier coller :

     Public Sub AdapterImage(ByVal WB As WebBrowser, Optional ByVal AgrandissementSiPlusPetit As Boolean = False, Optional ByVal GarderProportions As Boolean = True)
    
        If GarderProportions = False Then 'si on ne souhaite pas garder les proportions
    
          Dim elements As System.Windows.Forms.HtmlElement
    
          For Each elements In WB.Document.GetElementsByTagName("img") 'on récupère toutes les images (ici, et surement toujours, une seule image mais on ne sait jamais)
            'on change les attributs largeur et hauteur par ceux du webbrowser
            elements.SetAttribute("width", WB.Width - 40) '- 40 encore une fois pour éviter les scrollbars..
            elements.SetAttribute("height", WB.Height - 40)
    
            WB.Document.Body.AppendChild(elements) 'on ajoute les attributs width et height à l'image afin de la redimensionner automatiquement
    
          Next
          Exit Sub 'on arrête ici, rien de plus est nécessaire
        Else
          'si on souhaite garder les proportions
          Dim nouvelleLargeur As Integer
          Dim nouvelleHauteur As Integer
    
          Dim tailleImage As Rectangle = WB.Document.Images.Item(0).ClientRectangle 'obtient les dimensions de l'image taille réelle
    
          If tailleImage.Width > WB.Width Or tailleImage.Height > WB.Height Then 'si l'image est plus grande que le Webbrowser..
    
            nouvelleLargeur = tailleImage.Width * WB.Height / tailleImage.Height
            nouvelleHauteur = tailleImage.Height * WB.Width / tailleImage.Width
            ' on réduit
            If nouvelleHauteur > WB.Height Then
              nouvelleHauteur = WB.Height
            End If
            If nouvelleLargeur > WB.Width Then
              nouvelleLargeur = WB.Width
            End If
    
            Dim element As System.Windows.Forms.HtmlElement
    
            For Each element In WB.Document.GetElementsByTagName("img") 'pareil qu'avant
    
              element.SetAttribute("width", nouvelleLargeur - 40) 'à cela près qu'on modifie selon la nouvelle largeur/hauteur
              element.SetAttribute("height", nouvelleHauteur - 40)
    
              WB.Document.Body.AppendChild(element)
    
            Next
          Else 'sinon, si l'image est plus petite
            If AgrandissementSiPlusPetit = True Then 'si l'on souhaite agrandir les images plus petites
    
              nouvelleHauteur = tailleImage.Height * nouvelleLargeur \ tailleImage.Width
              'on agrandit selon le côté le plus petit du WebBrowser
              If WB.Width <= WB.Height Then
                nouvelleLargeur = WB.Width
                nouvelleHauteur = (tailleImage.Height * nouvelleLargeur) \ tailleImage.Width
              Else
                nouvelleHauteur = WB.Height
                nouvelleLargeur = (tailleImage.Width * WB.Height) \ tailleImage.Height
              End If
    
              For Each element In WB.Document.GetElementsByTagName("img") 'même chose qu'avant
    
                element.SetAttribute("width", nouvelleLargeur - 40)
                element.SetAttribute("height", nouvelleHauteur - 40)
    
                WB.Document.Body.AppendChild(element)
    
              Next
            End If
    
          End If
        End If
    
      End Sub
    

    Et l'exemple d'utilisation :

     Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    
        If WebBrowser1.Url.AbsoluteUri.EndsWith("jpg") Or WebBrowser1.Url.AbsoluteUri.EndsWith("png") Or WebBrowser1.Url.AbsoluteUri.EndsWith("bmp") _
           Or WebBrowser1.Url.AbsoluteUri.EndsWith("gif") Then 'si on navigue vers une image
         
    
          AdapterImage(WebBrowser1) 'on adapte l'image
      
        End If
    
      End Sub
    


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    lundi 21 février 2011 20:06
  • Bonjour Michel,

    Merci, on y arrive, tu y arrives, c'est presque ça, alors déjà si tu veux bien, comme ça tient dans une de mes procédures, on va rester sur cette procédure exclusivement, ainsi on n'aura pas à faire des appels, ma procédure étant :

    ' MOI
    
     Sub WebBrowser1_DocumentCompleted_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
     Timer1.Enabled = False ' trouvé
     zoomOk = True
     ' -----------------
    
    ' TOI (dedans)
    
     Dim elements As System.Windows.Forms.HtmlElement
     For Each elements In WebBrowser1.Document.GetElementsByTagName("img")
      elements.SetAttribute("width", WebBrowser1.Width - 40) ' - 40 = scrollbar
      elements.SetAttribute("height", WebBrowser1.Height - 40)
      WebBrowser1.Document.Body.AppendChild(elements)
     Next
     Dim nouvelleLargeur As Integer
     Dim nouvelleHauteur As Integer
     Dim tailleImage As Rectangle = WebBrowser1.Document.Images.Item(0).ClientRectangle ' dimensions img
     If tailleImage.Width > WebBrowser1.Width Or tailleImage.Height > WebBrowser1.Height Then ' si + grand
      nouvelleLargeur = tailleImage.Width * WebBrowser1.Height / tailleImage.Height
      nouvelleHauteur = tailleImage.Height * WebBrowser1.Width / tailleImage.Width
      ' on réduit
      If nouvelleHauteur > WebBrowser1.Height Then nouvelleHauteur = WebBrowser1.Height
      If nouvelleLargeur > WebBrowser1.Width Then nouvelleLargeur = WebBrowser1.Width
      Dim element As System.Windows.Forms.HtmlElement
      For Each element In WebBrowser1.Document.GetElementsByTagName("img") 'pareil qu'avant
      element.SetAttribute("width", nouvelleLargeur - 40) ' mais modifie selon nouvelles dimensions
      element.SetAttribute("height", nouvelleHauteur - 40)
      WebBrowser1.Document.Body.AppendChild(element)
      Next
     End If
     If tailleImage.Width < WebBrowser1.Width Or tailleImage.Height < WebBrowser1.Height Then ' si + petit
      nouvelleHauteur = tailleImage.Height * nouvelleLargeur \ tailleImage.Width
      'on agrandit selon le côté le plus petit du WebBrowser
      If WebBrowser1.Width <= WebBrowser1.Height Then
      nouvelleLargeur = WebBrowser1.Width
      nouvelleHauteur = (tailleImage.Height * nouvelleLargeur) \ tailleImage.Width
      Else
      nouvelleHauteur = WebBrowser1.Height
      nouvelleLargeur = (tailleImage.Width * WebBrowser1.Height) \ tailleImage.Height
      End If
      For Each element In WebBrowser1.Document.GetElementsByTagName("img") 'même chose qu'avant
      element.SetAttribute("width", nouvelleLargeur - 40)
      element.SetAttribute("height", nouvelleHauteur - 40)
      WebBrowser1.Document.Body.AppendChild(element)
      Next
     End If
     End Sub ' adapter image
    
    

    Si tu le veux bien il y a des éléments qui semblent manquer ou ne pas aller :

    -1- D'une part, comme tu le soulignes, il n'est pas utile de tester toutes les images potentielles, d'autant, comme tu le soulignes encore, qu'il n'y en a généralement qu'une, alors peux-tu mettre le code pour ne tester qu'une seule image, genre (limage = webbrowser1.sonImage), sauf si on a besoin de parcourir toute la liste ?

    -2- S'il n'y a pas d'image, de sortir en erreur msgbox("Absence d'image" exit sub

    -3- Il est relativement vain de prévoir un cas où l'image serait exactement adaptée, il vaut mieux la recalculer par sécurité.

    -4- Le redimensionnement n'est pas toujours bon car il faut calculer avec un ratio commun, celui qui ira avec la fenêtre du webbrowser, et appliquer ce ratio à la largeur et à la hauteur, sinon tu déformes l'image (ce qui n'est pas le but). Voici le calcul (à vérifier) :

    '
    dim rX , rY , ratio as double
    ratio = 1
    rX = fix(1 / image.width * webbrowser1.widht, 0)
    rY = fix(1 / image.height * webbrowser1.height, 0)
    if rX > 1 and rY > 1 then ' le+petit
     if rX > rY then ratio = rY
     if rX < rY then ratio = rX
    end if
    if rX < 1 and rY < 1 then ' le+grand
     if rX > rY then ratio = rX
     if rX < rY then ratio = rY
    end if
    if rX > 1 and rY < 1 then ratio = rY ' le+petit
    if rX < 1 and rY > 1 then ratio = rX ' le+petit
    if rX = rY and rX <> 1 then ratio = rX
    if ratio <> 1 then image.width * image.width * ratio
    '
    

    Ce qui hélas me limite dans tout ça c'est l'absence d'un bon didacticiel exhaustif en français qui me donne la syntaxe ... Si tu veux écrire des FAQ, tu peux faire un traité exhaustif sur le webBrowser, hum :o)

    Bon, ben si on applique tout ça, ça devrait tourner :o)

    ??? au plaisir, cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire

    • Modifié EhJoe mardi 22 février 2011 11:05 complément code
    mardi 22 février 2011 06:45
  • Bonjour Ehjoe,

    1. Alors déjà il n'est certes pas utile de tester toutes les images potentielles, mais je trouve ce moyen d'accès pas trop mauvais. D'ailleurs au final ça ne change pas grand chose, car la boucle s'arrête au premier élément.

    En fait là on parle uniquement de lien direct d'une image, et non d'une page .html ou autre contenant 1 ou plusieurs image(s). La boucle ne pose donc pas de gros problèmes de temps ou autre.

    Si on veut vraiment se passer de la boucle on peut changer les boucles qui ressemblent plus ou moins à  :

     

     For Each elements In WB.Document.GetElementsByTagName("img")
    
       elements.SetAttribute("width", WB.Width - 40)
       elements.SetAttribute("height", WB.Height - 40)
    
       WB.Document.Body.AppendChild(elements)
    
     Next
    

    par :

     

     Dim element As System.Windows.Forms.HtmlElement = WB.Document.All.Item(4)
       
       element.SetAttribute("width", WB.Width - 40) 
       element.SetAttribute("height", WB.Height - 40)
    
     WB.Document.Body.AppendChild(element)
    

    En effet Item(4) donne la balise IMG (0 = html, 1 = head, 2 = title, 3 = body, 4 = img).

    Alors bon ça fait plus propre, mais je ne suis pas sûr que cela s'applique à toutes les pages !

    Je ne pense pas avoir besoin de recopier tout le code ? Il suffit de remplacer les boucles par ce que j'ai cité juste au dessus.

    2. Je pensais qu'au lieu d'ennuyer l'utilisateur avec une MsgBox ou autre, on teste tout simplement si il navigue vers une image, et si ce n'est pas le cas, on ne fait rien.

    Pour tester si on navigue vers une image il existe à nouveau plusieurs façon de procéder dont celle que j'ai donnée hier :

     If WebBrowser1.Url.AbsoluteUri.EndsWith("jpg") Or WebBrowser1.Url.AbsoluteUri.EndsWith("png") Or WebBrowser1.Url.AbsoluteUri.EndsWith("bmp") _
        Or WebBrowser1.Url.AbsoluteUri.EndsWith("gif") Then 'si on navigue vers une image
       
    
       AdapterImage(WebBrowser1) 'on adapte l'image
     
      End If
    

    3. Je ne pense pas qu'un problème se pose si l'image est de la même taille du webbrowser. Il faudrait peut-être tester, mais de toute manière on sera dans notre "Else" (image plus petite) et le redimensionnement sera quand même fait. J'ai noté "sinon, si l'image est plus petite" mais c'est plutôt "sinon, si l'image est plus petite ou égale à la taille du WB".

    4. Je n'ai pas bien compris. Le ratio est gardé (à qqes centièmes près..) lorsqu'on souhaite garder les proportions. Je ne trouve pas les images déformées.

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    • Marqué comme réponse EhJoe mercredi 23 février 2011 03:20
    mardi 22 février 2011 13:44
  • Bonjour Michel,

    Suite après le code (un peu remanié) :

    Sub WebBrowser1_DocumentCompleted_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
      Dim nouvelleLargeur, nouvelleHauteur As Integer ' trouvé
      Dim element As System.Windows.Forms.HtmlElement = WebBrowser1.Document.All.Item(4)
      Dim t As Rectangle = WebBrowser1.Document.Images.Item(0).ClientRectangle ' dim img
      Dim cas As String = "++"
      If t.Width < WebBrowser1.Width Or t.Height < WebBrowser1.Height And WebBrowser1.Width <= WebBrowser1.Height Then cas = "-x"
      If t.Width < WebBrowser1.Width Or t.Height < WebBrowser1.Height And WebBrowser1.Width > WebBrowser1.Height Then cas = "-y"
      Select Case cas
       Case "++"
        nouvelleLargeur = t.Width * WebBrowser1.Height / t.Height
        nouvelleHauteur = t.Height * WebBrowser1.Width / t.Width
        If nouvelleLargeur > WebBrowser1.Width Then nouvelleLargeur = WebBrowser1.Width
        If nouvelleHauteur > WebBrowser1.Height Then nouvelleHauteur = WebBrowser1.Height
       Case "-x"
        nouvelleLargeur = WebBrowser1.Width
        nouvelleHauteur = t.Height * nouvelleLargeur \ t.Width
        nouvelleHauteur = (t.Height * nouvelleLargeur) \ t.Width
       Case "-y"
        nouvelleLargeur = (t.Width * WebBrowser1.Height) \ t.Height
        nouvelleHauteur = t.Height * nouvelleLargeur \ t.Width
        nouvelleHauteur = WebBrowser1.Height
      End Select
      element.SetAttribute("width", nouvelleLargeur - 30)
      element.SetAttribute("height", nouvelleHauteur - 17)
      Timer1.Enabled = False
      zoomOk = True
     End Sub
    

    En effet le ratio n'est pas utile car tu le fais en écrivant une double opératipon de conversion.

    J'ai enlevé la ligne qui suit, car je n'ai pas compris son utilité ?

    WebBrowser1.Document.Body.AppendChild(element)
    
    

    Bon, ben après tout ça, a priori c'est terminé, alors je ne peux que te remercier du fond du coeur pour ton aimable participation, toutefois, je crois que la prochaîne fois, si possible je prendrai une pcitureBox qui peut faire sensiblement la même chose, mais dont les directives sont connues facilement en français, elles ...

    Très cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse EhJoe mercredi 23 février 2011 03:20
    mercredi 23 février 2011 03:19
  • Bonjour EhJoe,

    En effet la ligne AppendChild est inutile, l'élément étant déjà dans le code HTML.

    C'est un plaisir d'aider :)


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    jeudi 24 février 2011 10:47
  • Moi je me demandais si on pouvais faire la même chose avec une page HTML, je m'explique je suis entrain de creer un éditeur HTML avec un webBroser Mais j'ai quelque problème de conversion car mm si mon webbroser est limité dans ma form quand je le convertit en fichier html toute la disposition change en comparaison à ce que j'ai dans ma fenêtre Quelqu'un a une idée ??
    mercredi 25 janvier 2012 14:20