2009-09-25 7 views
4

La Galerie de photos vous permet de marquer le visage d'une personne et d'y apposer une étiquette. Je comprends qu'il insère des balises directement dans le fichier plutôt que de le stocker dans une base de données ou dans un métafichier qui l'accompagne.Lecture de "Tags de personnes" insérée par la Galerie de photos Windows Live

Donc, si cela est vrai, quelles données insèrent-elles et comment sont-elles formatées?

+0

Quelle galerie de photos? – bobbymcr

Répondre

4

Voici le code que je voulais. C'est en C#.

 public void ReadWLPGRegions(string sourceFile) 
    { 
     string microsoftRegions = @"/xmp/RegionInfo/Regions"; 
     string microsoftPersonDisplayName = @"/PersonDisplayName"; 
     string microsoftRectangle = @"/Rectangle"; 
     BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile; 

     using (Stream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read)) 
     { 
      BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream, createOptions, BitmapCacheOption.None); 

      // Check source has valid frames 
      if (sourceDecoder.Frames[0] != null && sourceDecoder.Frames[0].Metadata != null) 
      { 
       BitmapMetadata sourceMetadata = sourceDecoder.Frames[0].Metadata as BitmapMetadata; 

       // Check there is a RegionInfo 
       if (sourceMetadata.ContainsQuery(microsoftRegions)) 
       { 
        BitmapMetadata regionsMetadata = sourceMetadata.GetQuery(microsoftRegions) as BitmapMetadata; 

        // Loop through each Region 
        foreach (string regionQuery in regionsMetadata) 
        { 
         string regionFullQuery = microsoftRegions + regionQuery; 

         // Query for all the data for this region 
         BitmapMetadata regionMetadata = sourceMetadata.GetQuery(regionFullQuery) as BitmapMetadata; 

         if (regionMetadata != null) 
         { 
          if (regionMetadata.ContainsQuery(microsoftPersonDisplayName) && 
           regionMetadata.ContainsQuery(microsoftRectangle)) 
          { 
           Console.Writeline(regionMetadata.GetQuery(microsoftRectangle).ToString())); 
           Console.WriteLine(regionMetadata.GetQuery(microsoftPersonDisplayName).ToString())); 
          } 

         } 
        } 
       } 
      } 
     } 
    } 
+0

Avez-vous trouvé une solution similaire en Python? – Andrew

+0

Non. Le code repose assez fortement sur les structures Microsoft, et je ne connais aucune bibliothèque Python avec les équivalents. –

1

Lorsque cela est possible, Windows Live Photo Gallery utilise XMP pour écrire des métadonnées dans des fichiers image. Voir Metadata and the Windows Vista Photo Gallery pour plus de détails.

+0

À quel offset d'octets le XMP démarre-t-il? –

+0

Dans l'article de Wikipédia que j'ai lié ci-dessus, il liste "Emplacement dans les types de fichiers". Par exemple, un fichier JPEG contient des données XMP dans le segment d'application 1 (0xFFE1) avec l'en-tête de segment "http://ns.adobe.com/xap/1.0/\x00". – bobbymcr