Meilleur auteur de réponses
Images TIFF et métadonnées EXIF

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
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
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 -
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 -
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
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.
-
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 -
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 -
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 -
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 -
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 -
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 -
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
-
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 -
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 -
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