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

jurassic pork

XLDnaute Occasionnel
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.
Le souci c'est que l'original est écrasé et la propriété orientation est modifiée . L'image affichée par la visionneuse windows n'est plus dans le bon sens dans le cas des images de jeff1494
 

Staple1600

XLDnaute Barbatruc
Re

@jurassic pork
Juste pour ma gouverne, tu as quelle version de Windows ?
Moi, je suis sûr W10 22H2 build 19045.4529
Et je n'ai plus la visionneuse Windows dans le menu contextuel
(sauf à manipuler la base de registre comme évoqué précédemment)

Tu as toujours la visionneuse de photos sans avoir manipuler le registre ?
 

Staple1600

XLDnaute Barbatruc
Re

@jurassic pork
Merci pour le retour
Après avoir examiner les divers fichiers *.reg proposés sur différents sites, j'ai fait la manip à la mano
Et désormais j'ai bien l'ancienne visionneuse Photos dans le menu contextuel
Visionneuse.png
Sans cette manip dans le registre, c'est Photos qui ouvre par défaut les fichiers "image" lors d'un double-clic.

Par contre, dans Photos, si j'ouvre plusieurs images en même temps, je dois appliquer la rotation sur chaque image une par une.
(en passant à l'image suivante en cliquant sur la flèche au bord droit de l'écran)
Ce qui finira par faire mal aux doigts si le dossier contient une ou des centaines d'images ;)
 

Staple1600

XLDnaute Barbatruc
Re

@jeff1494
Voir le lien dans le message#15
Mais comme il s'agit de toucher à la base de registre, je décline toute responsabilité en cas de problème.

Ceci dit, je n'ai pas eu de problème sur mon PC, donc ...

PS: Il y a plein de sites qui expliquent comment faire
Faire cette recherche sur G..gle
W10 restaurer la visionneuse de photos
Choisis celui qui est le plus explicite

Bonnes lectures
 

TooFatBoy

XLDnaute Barbatruc
Le souci c'est que l'original est écrasé et la propriété orientation est modifiée .
Rappel : on l'avait supprimée avant de retourner les images. ;)
Quant à écraser l'original, je pense qu'ici on s'en moque puisque ledit original n'en est pas un.



Pour ces photos j'ai les originaux pris depuis un téléphone.
Oui, on a bien vu que les photos ont été prises avec un Samsung J6 pivoté d'un quart de tour, et qu'elles faisaient 3096x4128 pixels (ratio = 3/4) avant que tu les redimensionnes en 336x450 (ratio un peu différent de 3/4), et que tu n'utilises donc pas les originaux pour mettre dans les commentaires des cellules. ;)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Appelons un chat un chat
La visionneuse de Windows 10 permet de pivoter une image simplement en cliquant sur la flèche arrondie.
C'est l'application Photos qui a remplacé la visionneuse de Windows
C'est bien ce qu'a compris le demandeur, et c'est là le principal
jeff1494 à dit:
@Staple1600 : Pourrais tu me donner plus de détails concernant les manips que tu as fait pour avoir le retour de la visionneuse?
Merci d'avance.
 

jurassic pork

XLDnaute Occasionnel
Hello,
voici un exemple de code VBA pour faire tous les traitements avec WIA en une seule fois. Dans cet exemple, j'applique 3 filtres sur l'image originale. Le premier filtre réduit l'image de moitié en largeur et hauteur. Le deuxième filtre applique une rotation correspondant à l'orientation indiquée par la propriété EXIF et le troisième filtre remet cette orientation à 0° vu que l'on a appliqué la rotation.

VB:
Sub TraiterImage(inFile As String, outFile As String)
    'J.P juin 2024
    RotArray = Array(0, 0, 0, 180, 0, 0, 90, 0, 270) ' le tableau commence ici à 0 ex RotArray(6) = 90
    Dim Img As Object, IP As Object
    Set IP = CreateObject("WIA.ImageProcess") 'création objets WIA
    Set Img = CreateObject("WIA.ImageFile")
    Img.LoadFile inFile 'charger image
    IP.Filters.Add IP.FilterInfos("Scale").filterid ' filtre 1 redimensionnement
    IP.Filters(1).Properties("MaximumWidth") = Img.Width \ 2  ' largeur à 50%   \ division entière
    IP.Filters(1).Properties("MaximumHeight") = Img.Height \ 2 ' hauteur à 50%
    IP.Filters.Add IP.FilterInfos("RotateFlip").filterid ' filtre 2 rotation
    IP.Filters(2).Properties("RotationAngle") = RotArray(Img.Properties(5).Value) 'on utilise la propriété Exif d'Orientation
    IP.Filters.Add IP.FilterInfos("Exif").filterid ' filtre 3 Exif pour mettre la propriété EXIF d'orientation à 0°
    IP.Filters(3).Properties("ID") = 274    'Orientation
    IP.Filters(3).Properties("Type") = 1003 'UnsignedIntegerImagePropertyType
    IP.Filters(3).Properties("Value") = 1   ' Orientation à 0°
    Set Img = IP.Apply(Img) ' on applique tous les filtres
    If Len(Dir(outFile)) > 0 Then Kill outFile ' on écrase le fichier de destination si il existe
    Img.SaveFile outFile 'sauvegarde image
    Set IP = Nothing: Set Img = Nothing
End Sub


Sub TestImage()
    TraiterImage "D:\Dev\Office\Excel\Jpg\OBJ002.jpg", "D:\Dev\Office\Excel\Jpg\N_OBJ002.jpg"
End Sub

Ami calmant, J.P
 

jeff1494

XLDnaute Occasionnel
Bonjour à tous;
Un point sur ma situation.
Alors en reprenant les conseils de TooFatBoy, et après avoir réinstallé la visionneuse de Windows, je reprends chaque photo dont l'orientation ne convient pas, et j'applique les rotations qui vont bien. Une fois cela fait tout rentre dans l'ordre et j'ai les photos dans le bon sens.

@jurassic pork : merci pour ton code. Je vais le regarder de près et voir comment je pourrais l'utiliser.

Dans l'immédiat j'aurais toujours la solution manuelle en passant par la visionneuse de Windows.

Je tiens à tous vous remercier pour votre aide et l'apport de vos solutions. Je vais tester la solution de Jurassicpork. Et je vous tiendrais au courant. Certainement seulement demain, car aujourd'hui, repas de famille donc pas trop de temps libre. Il faut que je finisse de préparer le couscous.

Dans tous les cas encore merci et bonne journée à vous tous.
 

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh