XL 2021 Orientation d'une image dans le commentaire d'une cellule

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
Je rencontre le problème suivant :
J'ai un fichier Excel avec un tableau contenant 8 colonnes, et dans la deuxième colonne j'ai la description d'un objet, le but est d'insérer la photo de l'objet dans le commentaire de la cellule. Les photos sont préfixées avec la constante "OBJ" et est suivi d'un numéro d'ordre séquentiel.

J'ai une macro que j'ai récupéré qui a pour but d'insérer une image de l'objet dans le commentaire de la cellule où on est positionné. Cette image est au format "jpg", et soit avec une orientation "portrait" ou "paysage" suivant le cas.
La macro fonctionne parfaitement bien, dans le sens que je sélectionne la photo voulue depuis un dossier qui se trouve dans le même répertoire que le fichier Excel, et qu'elle est insérée dans de le commentaire de la cellule sélectionnée.

Mon problème est que l'orientation d'origine de la photo n'est pas respectée. Ce qu'elle que soit la macro utilisée (Individuelle, ou en "masse").
Pour appeler les macros je passe par le menu du ruban "Outil de saisie" juste après l'Accueil.
J'ai deux macros une pour un ajout individuel de photo (AjoutImage), et l'autre pour un ajout en "masse" de photos (AjoutLotImages).
Le résultat est le même quelle que soit la macro utilisée.
En résolvant le problème sur la première macro je pourrait ensuite régler le problème sur la deuxième.

Par exemple la première photo est en format "portrait" mais elle se retrouve en format "Paysage" dans le commentaire.
En fait toutes les images semblent faire un quart de tour vers la droite (sens horaire).
Voici la macro pour un ajout individuel de photo que j'utilise :

VB:
'Callback for BtnAddImage onAction
Sub AjoutImage(control As IRibbonControl)

    'X1c_131 Ajouter une image dans un comentaire de cellule (XLOneClick G.CHARRAULT)
    Dim PicturePath As String       'Chemin c'acces au fichier. Récupéré avec GetOpenFilename
    Dim MaxWidth As Integer
    Dim MaxHeight As Integer
    Dim pic As Object
    MaxWidth = 450
    MaxHeight = 350
  
    ' Ci après on va demander à l'utilisateur de choisir un fichier 'GetOpenFilename'
    PicturePath = Application.GetOpenFilename("images(*.jpg;*.bmp;*.png;*.gif), *.jpg;*.bmp;*.png;*.gif", , "Sélectionner une image")
    'cas ou l'utilisateur annule sa recherche
    On Error Resume Next
    'on définit une image pour en déduire les dimensions
    Set pic = ActiveSheet.Pictures.Insert(PicturePath)
    If Err.Number <> 0 Then GoTo GestError
    With ActiveCell
        'Si il n'y a pas de commentaire, on en crée un vide
        If (.Comment Is Nothing) Then .AddComment (" ")
        .Comment.Shape.Fill.UserPicture (PicturePath)
        'Déverrouillage du ratio
        .Comment.Shape.LockAspectRatio = msoFalse
        '(re-)dimensionement
        If Round(pic.Height, 0) < MaxHeight And Round(pic.Width, 0) < MaxWidth Then
            .Comment.Shape.Width = Round(pic.Width, 0)
            .Comment.Shape.Height = Round(pic.Height, 0)
        Else
            If pic.Width > pic.Height Then
                .Comment.Shape.Width = MaxWidth
                .Comment.Shape.Height = Round(pic.Height * .Comment.Shape.Width / pic.Width, 0)
            Else
                ActiveCell.Comment.Shape.Height = MaxHeight
                ActiveCell.Comment.Shape.Width = Round(pic.Width * .Comment.Shape.Height / pic.Height, 0)
            End If
        End If
        'verrouillage
        .Comment.Shape.LockAspectRatio = msoTrue
    End With
    pic.Delete
GestError:
    Set pic = Nothing
End Sub

Je subodore que mon problème est lié à la taille de l’image, mais je n'en suis pas sûr. J'ai un peu de mal à suivre tous les détails.
Cela se passerait-il dans la partie "(re-)dimensionnement"?
Donc si une personne qui serait prête à m'aider pouvait m'expliquer ce qui ne va pas j'en serais ravi.

A toutes fins utiles je vous joins un fichier ZIP qui contient les images (dossier "Jpg") ainsi que mon fichier Excel.
Aucune donnée n'est ni sensible, ni confidentielle.

D'avance je remercie chaleureusement toute personne qui m'aidera.

Bonne journée à toutes et tous.
 

Pièces jointes

  • PBImageCommentaire.zip
    524.4 KB · Affichages: 15

TooFatBoy

XLDnaute Barbatruc
Bonjour,

46 vues et aucune réponse... alors je me jette à l'eau, ça créera peut-être des vocations. 😅

Perso, je supprimerai l'orientation dans les exif.
Mais du coup les images seraient tournées d'un quart de tour vers la droite dans tous les programmes, alors je tournerai les images d'un quart de tour vers la gauche.
Et normalement les images seront alors dans le bon sens partout.
 

jurassic pork

XLDnaute Occasionnel
Hello,
voici une fonction qui permet de savoir quelle est l'orientation EXIF dans un fichier jpg qui contient cette information :
VB:
Function WIA_ExifOrientation(sFile As String) As Integer
'J.P  Juin 2024
' Il existe 8 valeurs EXIF d 'orientation numérotées de 1 to 8.
' 1 = Horizontal (normal)
' 2 = Miroir horizontal
' 3 = Rotation 180°
' 4 = Miroir vertical
' 5 = Miroir horizontal et rotation 270°
' 6 = Rotation 90°
' 7 = Miroir horizontal et rotation 90°
' 8 = Rotation 270°
    Dim Img As Object
    Set Img = CreateObject("WIA.ImageFile")
    WIA_ExifOrientation = "-1"
    On Error GoTo Erreur
    With Img
        .LoadFile sFile
         Debug.Print "---- ", sFile, " ----"
         'Properties(5) = orientation Exif
         Debug.Print .Properties(5).Name, " : ", .Properties(5).Value
         WIA_ExifOrientation = .Properties(5).Value
    End With
    Exit Function
Erreur:
    Debug.Print "Erreur lecture"
End Function
'Exemple d'utilisation 
Sub TestOrientation()
  Debug.Print WIA_ExifOrientation("d:\dev\Office\Excel\jpg\OBJ001.jpg")
End Sub
La fonction utilise WIA pour lire l'information dans le fichier jpg. Elle renvoie -1 si l'information n'est pas disponible dans le fichier où si le fichier n'est pas lisible.
Pour tes fichiers photo OBJxxx.jpg la fonction renvoie 6 (rotation de 90°).

Ami calmant, J.P
 

jeff1494

XLDnaute Occasionnel
Bonjour à vous deux, et merci pour votre aide.
Pour TooFatBoy : Coucou, me revoici avec encore des questions tordues (Cf Tensions) ;). Je vais essayer de voir ta manipulation, et voir ce qu'il en est. Ta deuxième question est très pertinente et si il existe une réponse j'aimerais bien la connaître.

Pour jurassic pork : Je vais vérifier avec ton code le résultat pour toutes mes photos. Si en effet elles renvoient la valeur 6 (rotation de 90°), je me demande si en modifiant les EXIF, par un soft externe et avant de les traiter par mon fichier, de mes photos il n'y aurait pas moyen de résoudre le problème. Je dois me pencher sur le problème.
Voici en gros ce que je vais tester :
  • Créer un fichier Excel qui a pour but de me créer un tableau des photos présentes dans un dossier.
    • Sélection d'un dossier.
    • Boucle de lecture des photos.
      • Pour chaque photo utiliser ta fonction "WIA_ExifOrientation" pour lister le nom de la photo et la valeur " EXIF d 'orientation" de la photo.
  • En utilisant cette liste modifier la valeur d'orientation des EXIF, et ce pour chaque photo. Cela devra être fait manuellement. SAUF bien sûr si il y a un moyen de faire la modification d'une manière automatique. Soit par un soft de gestion de photo, soit via un moyen quelconque par EXCEL.
Dans mon cas personnel je ne devrais pas avoir beaucoup plus de 200 photos, et cette opération est une opération qui restera rare. Donc pas de soucis même si il me faut travailler manuellement sur les photos.

Dans tous les cas je vous tiendrais au courant de mon avancée.
je tiens à vous remercier pour votre aide.
Je vous souhaite une bonne journée.
A+
 

TooFatBoy

XLDnaute Barbatruc
je me demande si en modifiant les EXIF, par un soft externe et avant de les traiter par mon fichier, de mes photos il n'y aurait pas moyen de résoudre le problème.
C'est exactement ce que je t'ai proposé de faire. ;)

Tu mets toutes tes images dans un dossier.
Tu supprimes l'orientation de toutes les images du dossier (se fait en une fois avec un traitement par lot).
Tu tournes toutes tes images dans le bon sens.
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour à toutes & à tous, @jeff1494, @jurassic pork , @TooFatBoy
Je mets en pièce jointe un fichier que j'avais fait sur un autre fil ici
Il permet d'afficher les propriétés EXIF d'une image (onglet "Liste Propriétés"), ou d'afficher une miniature (en tenant compte de l'orientation) avec le chemin de la photo, l'auteur du cliché, et les coordonnées GPS plus, si les coordonnées existent, un lien vers Google map.
Un clic sur la miniature permet d'afficher pendant 3s la photo dans un userform.
 

Pièces jointes

  • Traitement EXIF bis.xlsm
    134.7 KB · Affichages: 6
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Pour faire pivoter automatiquement les images jpg en fonction des données EXIF qu'elles contiennent , on peut utiliser nconvert qui est gratuit (en usage personnel ou éducation). Il peut fonctionner en traitement par lot.
Exemple d'utilisation :
Code:
d:\Logiciels\NConvert\nconvert -jpegtrans exif -o rotated_%.jpg *.jpg

rotated_OBJ001.jpg

rotated_OBJ001.jpg
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

@jeff1494
Bien que je ne sois pas à l'aise avec les lignes de commandes,
Si tu es plus à l'aise avec Excel et VBA, VBA sait parler ligne de commande
Ou plutôt on peut exécuter une ligne de commande Dos depuis VBA.
(et selon le cas ou le besoin, en mode silencieux, sans faire apparaitre l'invite MS-Dos [qui rappelle de bons souvenirs aux plus anciens ;) ] )

On peut aussi simplement faire un batch (avec le bloc-notes)
->extension : *.bat ou *.cmd
ou pour être plus moderne passer par un *.vbs
et pour être au top du dernier cri, passer par un script PowerShell
 

TooFatBoy

XLDnaute Barbatruc
Bien que je ne sois pas à l'aise avec les lignes de commandes, je vais regarder ta solution.
La visionneuse de Windows 10 permet de pivoter une image simplement en cliquant sur la flèche arrondie.

Ou encore plus simplement : dans l'explorateur de fichiers de Windows tu sélectionnes toutes les images à pivoter, puis tu cliques sur "Faire pivoter à gauche" ou "Faire pivoter à droite", et toutes les images pivotent d'un coup. ;)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

La visionneuse de Windows 10 permet de pivoter une image simplement en cliquant sur la flèche arrondie.
Depuis je ne sais plus quelle mise à jour, la visionneuse a été remplacée par Photos
plus d'infos ici

Je sais qu'il y existe un moyen de retrouver la vieille visionneuse
mais qui implique le téléchargement d'un *.zip en provenance d'un tiers
et d'un bidouillage dans la base de registre.
Mais là on n'est plus dans le monde d'Excel
[/ISPOILER]
 

Staple1600

XLDnaute Barbatruc
Re

Oui, j'ai bien compris.
Sauf qu'elle n'est plus disponible suite à l'installation de Photos

G..gle nous en dit plus à ce sujet (ce que j'évoquais dans mes Précisions du message#13)
Un exemple parmi moult

Par contre, ceci est toujours disponible sur le ruban Gérer/Outils d'images
Ou encore plus simplement : dans l'explorateur de fichiers de Windows tu sélectionnes toutes les images à pivoter, puis tu cliques sur "Faire pivoter à gauche" ou "Faire pivoter à droite", et toutes les images pivotent d'un coup
Microsoft n'a donc pas tout saccagé avec ses MAJ.
 

Statistiques des forums

Discussions
314 013
Messages
2 104 551
Membres
109 078
dernier inscrit
Nikitoklass