none
Images TIFF et métadonnées EXIF RRS feed

  • Question

  • Bonjour,

    Je dispose d'images TIFF contenant des méta-données EXIF qui sont affichées par certains logiciels (par exemple Photoshop). Cependant, lorsque je les énumère avec le Framework 4.0, je n'en trouve qu'un sous ensemble !

    En particulier, Photoshop affiche la longueur focale de l'appareil de prise de vue dont le tag EXIF est 920A en hexa (37386 en décimal) alors que ce tag n'est pas présent dans l'image !!

    Ci-dessous le programme d'énumération des EXIF que j'ai utilisé (rtb est une RichTextBox placée sur Form1).

    Auriez-vous une idée du problème ? Je tiens une telle image à votre disposition.

    Merci de votre aide.

    Cordialement

      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
         
    
        'Create an Image object. 
        Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\" + "IMG_8233PhShop_180ppi" + "\"
        Dim image As Bitmap = New Bitmap(path + "IMG_8233PhShop_180ppi.tif")
    
        'Get the PropertyItems property from image.
        Dim propItems As PropertyItem() = image.PropertyItems
    
        'For each PropertyItem in the array, display the ID, type, and length.
        Dim count As Integer = 0
        Dim propItem As PropertyItem
    
        For Each propItem In propItems
          rtb.Text += "Property Item " & count.ToString()
          rtb.Text += " ; iD: 0x" & propItem.Id.ToString("x")
          rtb.Text += " ; type: " & propItem.Type.ToString()
          rtb.Text += " ; length: " & propItem.Len.ToString() & " bytes"
          rtb.Text += vbCr
    
          count += 1
        Next propItem
    
        'Convert the value of the second property to a string, and display it.
        Dim encoding As New System.Text.ASCIIEncoding()
        Dim manufacturer As String = encoding.GetString(propItems(1).Value)
    
        rtb.Text += "The equipment make is " & manufacturer & "."
    
      End Sub
    
    


    Alain
    vendredi 23 juillet 2010 14:40

Réponses

  • Bonjour,

    Le plus simple :

    • Pour les images JPG, il faut récupérer le metadata suivant : "/xmp/exif:FocalLength"
    • Pour les images TIFF, il faut récupérer le metadata suivant : "/ifd/{ushort=700}/exif:FocalLength"

    ATTENTION : Le résultat obtenu est une chaîne de caractère (et non un entier) contenant : "26749/1000". A vous de faire la division...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse AchLog dimanche 19 décembre 2010 18:38
    dimanche 19 décembre 2010 18:09
    Modérateur

Toutes les réponses

  • Bonjour,

    Je me demande si ce n'est pas une limitation de GDI+. Essayez d'utiliser les classes de WPF (http://msdn.microsoft.com/en-us/library/ms748873.aspx#_metadata) et voyez si vous pouvez extraire les metadata souhaitées...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 25 juillet 2010 20:26
    Modérateur
  • Bonsoir Gilles,

    Là, rapidement, je ne comprends pas bien comment faire pour lire les méta-données en WPF. Voici ce que j'ai écrit mais cela ne fonctionne pas. J'ai dû oublier qq chose. Avez-vous un petit exemple de ce qu'il faut faire ?

    Merci beaucoup.

      Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    
        Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\" + "IMG_8233PhShop_180ppi" + "\"
        Dim PngStream As New System.IO.FileStream(path + "IMG_8233PhShop_180ppi.tif", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
    
        Dim TifDecoder As New TiffBitmapDecoder(PngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
        Dim TifFrame As BitmapFrame = TifDecoder.Frames(0)
    
        Dim locallySetProperties As LocalValueEnumerator = TifFrame.GetLocalValueEnumerator()
        While locallySetProperties.MoveNext()
          Dim propertyToClear As DependencyProperty = locallySetProperties.Current.Property
          If Not propertyToClear.ReadOnly Then
            Console.Write(propertyToClear.Name)
          End If
        End While
    
      End Sub
    
    

    Cordialement

     


    Alain
    dimanche 25 juillet 2010 21:31
  • Bonjour,

     

    Alain, le tag dont vous parliez, 920A, je n’ai pas compris s’il est présent dans l’image ou pas. Il est interprété par Photoshop mais vous ne pouvez pas le trouver avec votre application ? Pouvez-vous le repérer avec un éditeur hexa ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

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

    Café des usages

    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.

     

     

    lundi 26 juillet 2010 13:46
  • Bonsoir Alex,

    Effectivement, mon application ne trouve pas le tag 920A alors que Photoshop le trouve. J'ai fourni plus haut le programme que j'ai utilisé pour énumérer les tag présents dans l'image.

    Je n'arrive pas encore à vérifier sa présence avec un programme WPF comme je suggère Gilles. Pouvez-vous m'aider à écrire ce programme ?

    La vérification avec un éditeur hexa (lequel ?) me parait difficile à réaliser car il faut interpréter parfaitement la structure binaire de l'image et de entête.

    Cordialement

     


    Alain
    lundi 26 juillet 2010 18:54
  • Bonsoir,

    Cette question est restée sans réponse bien que cette dernière aurait été importante pour moi.

    Je me permets de la réitérer : Je n'arrive pas encore à vérifier la présence de méta données dans une image avec un programme WPF (voir ci-dessus).

    Pouvez-vous m'aider à écrire le code WPF qui fournit ces métas données ?

    Merci d'avance.



    Alain
    dimanche 5 décembre 2010 23:24
  • Bonjour,

    Pouvez-vous m'envoyer une photo qui contient le tag 920A sur gilles.tourreau@pos.fr ? Merci de mettre l'URL de cette conversation dans l'e-mail.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 12 décembre 2010 14:08
    Modérateur
  • Bonjour,

    Essayez cet exemple de code et dites moi si la valeur récupérée est celle que vous attendez :

    Using fileStream As New FileStream("C:\Temp\IMG_8233PhShop_180ppi.jpg", FileMode.Open, FileAccess.Read)
    	Dim bf As BitmapFrame = BitmapFrame.Create(fileStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None)
    	Dim bitmapMetadata As BitmapMetadata = TryCast(bf.Metadata, BitmapMetadata)
    
    	Dim o As ULong
    	o = CULng(bitmapMetadata.GetQuery("/app1/{ushort=0}/{ushort=34665}/{ushort=37386}"))
    End Using
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 13 décembre 2010 20:41
    Modérateur
  • Bonsoir Gilles,

    Merci pour votre code.

    En l'utilisant sur l'image jpg, j'obtient bien une valeur numérique (que je n'ai pas analysée) mais, sur l'image tif, le résultat est 0. Ce qui signifie que là encore on ne trouve pas les métadonnées cherchées dans l'image tif alors que Photoshop (par exemple) les affiche !

    La valeur 37386 de la requête passée au GetQuery correspond à la valeur hexa 920A. Mais, cela dit, j'ai un petit soucis avec cette requête. Pouvez-vous l'expliciter ?

    Merci beaucoup.

     


    Alain
    lundi 13 décembre 2010 22:19
  • Oui Gilles, la valeur récupérée par cette méthode est parfaitement correcte :

          Dim numérateur As UInt32 = o And 4294967295
          Dim dénominateur As UInt32 = o >> 32
          Console.WriteLine((numérateur / dénominateur).ToString)
    
    

    soit : 26,749

    Cette méthode WPF fournit donc ici le même résultat que celle que j'ai initialement utilisée (cf mon premier message).

    Reste que l'on n'obtient pas ce résultat avec une image TIF...

    Bien cordialement

     


    Alain
    mardi 14 décembre 2010 12:40
  • Bonjour,

    Le plus simple :

    • Pour les images JPG, il faut récupérer le metadata suivant : "/xmp/exif:FocalLength"
    • Pour les images TIFF, il faut récupérer le metadata suivant : "/ifd/{ushort=700}/exif:FocalLength"

    ATTENTION : Le résultat obtenu est une chaîne de caractère (et non un entier) contenant : "26749/1000". A vous de faire la division...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse AchLog dimanche 19 décembre 2010 18:38
    dimanche 19 décembre 2010 18:09
    Modérateur
  • Gilles, vous êtes un Dieu !

    Mais enfin, comment faites-vous pour avoir réponse à toutes les questions ?

    J'aimerais quand même bien connaitre les explications concernant cette syntaxe. Pouvez-vous m'indiquer où les trouver ? Sont-elles publiques ?

    Merci encore.

    Je vous souhaite de bonnes fêtes de fin d'année.

    Bien cordialement

     


    Alain
    dimanche 19 décembre 2010 18:42
  • Bonjour,

    J'ai tout simplement essayé d'extraire par programmation toutes les metadata présentent dans les images.
    Ensuite avec des allez retours entre Photoshop et Visual Studio, j'ai réussi à récupérer les informations qui vous interessez...
    Me demandez pas pourquoi la metadata s'appelle : "/xmp/.....", je n'ai fait qu'extraire ces informations depuis les classes WPF et Photoshop.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 19 décembre 2010 18:52
    Modérateur
  • Très bien. J'ai donc une clé, même si je n'ai pas l'explication de son fonctionnement...

    L'application dans laquelle je vais intégrer ce mécanisme n'utilise en fait que le Framework 2.0 qui ne contient donc pas WPF. J'y tiens car cela permet à l'appli de fonctionner sur toutes les configurations. Certains utilisateurs n'ont pas installé les versions suivantes du Framework.

    Or les fonctions de WPF utilisées ici nécessitent les assembly WindowsBase et PresentationCore.

    Puis-je envisager de conserver mon appli sous Formework 2.0 et charger dynamiquement et utiliser ces assembly si besoin est (travail avec des images tif) ?

    Comment réaliser cela ?

    Merci pour ce complément d'info.

    Bien cordialement

     


    Alain
    dimanche 19 décembre 2010 21:51