【问题标题】:Reading "People Tags" inserted by Windows Live Photo Gallery阅读 Windows Live 照片库插入的“人物标签”
【发布时间】:2010-12-01 07:16:45
【问题描述】:

照片库使您能够标记人脸并为其应用标签。我知道它会将标签直接插入文件中,而不是将其存储在数据库或随处的元文件中。

如果这是真的,它插入的是什么数据以及它是如何格式化的?

【问题讨论】:

    标签: c# image metadata xmp


    【解决方案1】:

    这是我想要的代码。它在 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()));
                                }
    
                            }
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 你在 Python 中遇到过类似的解决方案吗?
    • 不。该代码在很大程度上依赖于 Microsoft 结构,我不知道有任何 Python 库具有等价物。
    【解决方案2】:

    如果可能,Windows Live 照片库会使用XMP 将元数据写入图片文件。详情请见Metadata and the Windows Vista Photo Gallery。

    【讨论】:

    • XMP 从什么字节偏移开始?
    • 在我上面链接的维基百科文章中,它列出了“文件类型中的位置”。例如,JPEG 在“Application Segment 1 (0xFFE1) with segment header 'ns.adobe.com/xap/1.0\x00'”中有 XMP 数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多