XL 2016 Userform - Comment réduite image en fonction du WebBrowser

webbacor

XLDnaute Nouveau
Bonjour,

je voudrai pouvoir réduire l'image insérer en fonction de la taille du webbrowse.

Private Sub lstImages_Click() WebBrowser1.Navigate (txtChemin & "" & lstImages.List(lstImages.ListIndex)) lblNomActuel = txtChemin & "\" & lstImages.List(lstImages.ListIndex) End Sub

Merci d'avance
 

patricktoulon

XLDnaute Barbatruc
regarde avec le tiens + body +calcule ratio
VB:
Private Sub lstImages_Click()
    Dim Img
    With WebBrowser1
        .Navigate "about:blank"
        Do While .ReadyState < 4: DoEvents: Loop
        'lblNomActuel = txtChemin & "" & lstFichiers.List(lstFichiers.ListIndex)
        lblNomActuel = "C:\Users\Public\Pictures\Sample Pictures\aaaa.jpg"
        style0 = "margin:0;width:100%;height:100%;"""
        style1 = "display:block;margin:0"
        .Document.Write "<body style=" & style0 & "><img id='MyImg' style=""" & style1 & """ src='" & lblNomActuel & "'></body>"
       
        Set Img = .Document.GetElementById("MyImg")
       
        Set body = .Document.getelementsbytagname("body")(0)
        wx = (body.ClientWidth) / Img.offsetwidth
        hx = (body.ClientHeight) / Img.offsetheight
        Ratio = Application.Min(wx, hx)    ' on prend le plus petit
        Img.Style.Width = Round((Img.offsetwidth * Ratio)) & "px"   'on applique a l'image - le 6 car j'ai enlever la marge du body(plein webbrowser)
        Img.Style.Height = "auto"    ' Round((Img.offsetheight * Ratio)) & "px"     'pareil

        'If Img.Width > .Document.body.ClientWidth Then Img.Style.Width = "100%"
        'If Img.Height > .Document.body.ClientHeight Then Img.Style.Height = "100%"
        Set Img = Nothing
        TextBox1 = .Document.getelementsbytagname("body")(0).outerhtml
    End With
End Sub
1632858806474.png
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour fanch55
si on ne voulait pas s'ennuyer avec les calculs on pourrait voir les choses a l'envers
sans property l'image est en aspect ratio a true d'origine
donc on pourrait simplement mettre le width de l'image au width du body
et si le height devient trop grand on met le height de l'image au height du body et le width de l'image en auto
j'ai bien sur ajouté le position:absolute dans le style pour pouvoir la centrer
et voila

donc ton exemple revue simplement avec cette idée
VB:
Private Sub lstImages_Click()
    Dim Img
    With WebBrowser1
        .Navigate "about:blank"
        Do While .ReadyState < 4: DoEvents: Loop
        'lblNomActuel = txtChemin & "" & lstFichiers.List(lstFichiers.ListIndex)
        lblNomActuel = "C:\Users\Public\Pictures\Sample Pictures\aaaa.jpg"
        style0 = "margin:0;width:100%;height:100%;"""
        style1 = "display:block;margin:0;position:absolute"
        .Document.Write "<body style=" & style0 & "><img id='MyImg' style=""" & style1 & """ src='" & lblNomActuel & "'></body>"

        Set Img = .Document.GetElementById("MyImg")

        Img.Width = .Document.body.ClientWidth    ' on force le width de l'image  au width du body sans chercher si c'est bon ou pas
        'forcement le height va se modifier car elle est en aspect ratio  d'origine
       
        ' donc on vérifie si le height n'est pas  devenu trop grand et on le remet  au height du body
        'et on met le width de l'image  en auto pour garder l'aspect ratio
        If Img.Height > .Document.body.ClientHeight Then Img.Style.Height = "100%": Img.Style.Width = "auto"

        'et on la centre
          Img.Style.Left = (.Document.body.ClientWidth - Img.offsetwidth) / 2
        Set Img = Nothing
        TextBox1 = .Document.getelementsbytagname("body")(0).outerhtml
    End With
End Sub
voila le ratio se fait en deux étapes par la condition "If"
 

webbacor

XLDnaute Nouveau
Bonjour et merci a tous.
Vous m'avez bien aidé et je vous en remercie encore,
je vous joint mon fichier( Visionneuse IMAGE) avec le code qui fonctionne et redimensionne les images. C'est super.
Comme annoncé, je suis novice et je ne sais pas comment procéder pour supprimer directement un fichier image du disque dur a partir de la listbox (liste des images)

pouvez vous m'aider;
Merci
 

Pièces jointes

  • essaiImage.xlsm
    32.1 KB · Affichages: 10

patricktoulon

XLDnaute Barbatruc
Bonjour
tu n'a rien écouté de notre débat a @fanch55 et moi
les deux tests if ( du redimensionnement) ne fonctionnent pas

; dis moi pourquoi utilise tu un webbrowser si c'est que des ".JPG" ????????
c'est absolument pas utile avec un simple control image en mode zoom tu n'a pas besoins de code
juste une ligne de load image :rolleyes:🤔

tu rempli ta liste avec un dir sur "jpg" NomFichier = Dir(txtChemin & "\*.jpg")
dis moi comment veux tu que la boucle do loop
VB:
Do While NomFichier <> ""
        If InStr(1, Right(NomFichier, 4), ".bmp") > 0 Or InStr(1, Right(NomFichier, 4), ".jpg") > 0 Or InStr(1, Right(NomFichier, 4), ".png") > 0 Or InStr(1, Right(NomFichier, 4), ".jpeg") > 0 Then
            lstFichiers.AddItem NomFichier
trouve autre chose que des jpg !!!! c'est pas bon !!!!

et j'en passe et des meilleures ,c'est pas la peine que j'aille jusqu'au bout
car là on partirait tout azimut
il faudrait savoir déjà si les images doivent etre de différent format
si tel est le cas il faut revoir le dir

bref a quoi ça sert que ducros se décarcasse hein !!!
 

webbacor

XLDnaute Nouveau
Désolé, vraiment désolé,
j'allais faire la correction après,
je m'initialise depuis peu et j'essaye d'y aller progressivement.
j'aurai du rectifié avant d'envoyer le fichier j'ai voulu mettre un bouton supprimer avant.
 

Pièces jointes

  • essaiImage.xlsm
    33.5 KB · Affichages: 7

fanch55

XLDnaute Barbatruc
@patricktoulon ,
Bonjour Pat,
Ci-joint le classeur dans lequel j'ai ma version un peu modifiée et ta dernière .
Il est vrai que la tienne occupe mieux l'espace du browser,
cependant il y a un petit phénomène bizarre et aléatoire tout au moins chez moi :
le premier chargement d'une nouvelle image n'est pas forcément bien optimisé, les ascenseur restent .
1632911488976.png
le second chargement corrige tout ...
1632911465474.png
 

Pièces jointes

  • img 100 100 percent webbrowser-1.xlsm
    25.7 KB · Affichages: 12

patricktoulon

XLDnaute Barbatruc
re
@fanch55
très étonnante votre gestion graphique
chez moi a aucun des essais ta version donne bon
de toute façon ça ne peut fonctionner correctement avec ton css
because
VB:
 Style = "display:block;margin-left:auto;margin-right:auto;max-width:100%;height:auto;"
        Style = "display:block;margin-left:auto;margin-right:auto;max-width:100%;height:auto;width:auto;max-height:100%"

Avec IE on ne peut pas utiliser 100% et maxheight ou maxwidth et margin:auto dans un style pour le même élément
les webmaster le font par ce que sur certain navigateurs certains membre de style ne peuvent être lu ils sont donc zappés ils ne gênent donc en rien

là on travaille avec le webbrowser donc librairie IE 09/10 et accepte css1 certaines chose du css2 css3

il est évident que ça va pas matcher sur IE (tantôt tu lui dis margin:auto donc marge automatique forcée et tantôt tu lui dis 100% c'est pas cohérent )surtout que tu ne margin pas à 0 ton body

il y a une seule logique a prendre
1° le body doit être a margin:0 pour supprimer les marges forcées natives
2° on a les dimensions body d'accessibles
3° on a les dimensions image d'accessibles
4° on calcule le quel prorata est le plus petit bodywidth/imagewidth et bodyheight/imageheght
5°on applique le prorata au width de l'image et le height on le met à auto pour garder l'aspect ration d'origine

avec cette logique on a un résultat supérieur ou inférieur a la taille de l'image d'origine selon le besoins

le principe est très simple a comprendre

si ça ne fonctionne pas dans le webbrowser c'est que votre librairie IE est défaillante ou absente
 

patricktoulon

XLDnaute Barbatruc
@fanch55
reprends ton double USF avec web et colle lui ça a la place de ton code (complet)
VB:
Option Explicit
Private Sub Run_Patrick(lblnomactuel)
    Dim Img, body As Object
    With WebPatrick
        .Navigate "about:blank"
        Do While .ReadyState < 4: DoEvents: Loop
        Set body = .Document.getelementsbytagname("body")(0)
        With body: .Style.margin = "0": .bgcolor = "brown": End With
        Set Img = .Document.body.appendchild(.Document.createelement("img"))
        With Img
            .src = lblnomactuel
            .ID = "MyImg"
            .Width = body.ClientWidth
            If .Height > body.ClientHeight Then Img.Style.Height = "100%": Img.Style.Width = "auto"
            With Img.Style
                .Position = "absolute"    ' sans ca on ne peut mettre une image ailleur qu'a gauche
                .Left = ((body.ClientWidth) - Img.offsetWidth) / 2     'on la centre en CSS
                .Top = ((body.ClientHeight) - Img.offsetheight) / 2     'on la centre en CSS
            End With
        End With
        TextPatrick = .Document.getelementsbytagname("body")(0).outerhtml
    End With
    Set Img = Nothing
End Sub
Private Sub Run_Fanch(lblnomactuel)
    Dim Img
    With WebFanch
        .Navigate "about:blank"
        Do While .ReadyState < 4: DoEvents: Loop
        .Document.Write "<img id='MyImg'  src='" & lblnomactuel & "'>"
        With .Document.body: .bgcolor = "brown": .Style.margin = 0: End With
        Set Img = .Document.GetElementById("MyImg")
        Img.Style.Position = "absolute"
        Img.Width = .Document.body.ClientWidth
        If Img.Height > .Document.body.ClientHeight Then Img.Style.Height = "100%": Img.Style.Width = "auto"
        Img.Style.Left = (.Document.body.ClientWidth - Img.offsetwidth) / 2
        Img.Style.Top = ((.Document.body.ClientHeight) - Img.offsetheight) / 2     'on la centre en CSS
        TextFanch = .Document.getelementsbytagname("body")(0).outerhtml
    End With
End Sub
Function GetSpecialFolder(Optional Target As Variant = &H5) As String
    Dim objFolderItem As Object
    On Error Resume Next
    Set objFolderItem = CreateObject("Shell.Application").Namespace(Target).Self
    If Err _
       Then GetSpecialFolder = "?" _
       Else GetSpecialFolder = objFolderItem.Path
    Set objFolderItem = Nothing
End Function

Private Sub GetImage_Click()
    Static ImgFile
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Sélectionner une Image"
        .InitialFileName = IIf(ImgFile = vbNullString, GetSpecialFolder(&H27), ImgFile)
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "Images", "*.*"
        If .Show Then
            ImgFile = .SelectedItems(1)
            Run_Fanch ImgFile
            Run_Patrick ImgFile
        End If
    End With

End Sub
avec celui la j'ai le même résultat pour les deux
l'un est monté en DOM l'autre ecrit avec write
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal