You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Metadata Extractor 2.8.0获取尼康D600的PictureControlName及访问makernotes的58个值?

解决Metadata Extractor 2.8.0访问尼康D600 Makernote中58个值的问题

一、遍历所有Makernote标签值

要查看那58个值的具体内容,直接遍历NikonType2MakernoteDirectory的所有标签即可,每个标签包含ID、名称、原始值和描述信息:

var mkNotes = directories.OfType<NikonType2MakernoteDirectory>().FirstOrDefault();
if (mkNotes != null)
{
    foreach (var tag in mkNotes.GetTags())
    {
        int tagId = tag.Type;
        string tagName = mkNotes.GetTagName(tagId);
        string rawValue = mkNotes.GetString(tagId);
        string description = mkNotes.GetDescription(tagId);
        
        Console.WriteLine($"ID: {tagId:X4}, 名称: {tagName}, 原始值: {rawValue}, 描述: {description}");
    }
}

二、解析PictureControlName的特殊处理

你遇到的[58个值]是因为TagPictureControl存储的是结构化字节数据,而非简单字符串,Metadata Extractor 2.8.0的默认解析无法直接提取名称,需要手动解析字节数组:

var mkNotes = directories.OfType<NikonType2MakernoteDirectory>().FirstOrDefault();
if (mkNotes != null && mkNotes.ContainsTag(NikonType2MakernoteDirectory.TagPictureControl))
{
    byte[] pcData = mkNotes.GetByteArray(NikonType2MakernoteDirectory.TagPictureControl);
    
    // 尼康D600的PictureControl结构:前4字节为版本号,后续是ASCII编码的名称(以空字符结尾)
    if (pcData.Length > 4)
    {
        int nullPos = Array.IndexOf(pcData, (byte)0, 4);
        if (nullPos > 4)
        {
            string pcName = Encoding.ASCII.GetString(pcData, 4, nullPos - 4);
            Console.WriteLine($"PictureControl名称: {pcName}");
        }
    }
}

说明

Metadata Extractor 2.8.0对部分尼康高端机型的Makernote结构化标签支持有限,默认的GetDescription只能返回原始数据的长度或概览,通过直接读取字节数组并按照尼康的Makernote规范解析,就能拿到目标字段的具体值。

内容的提问来源于stack exchange,提问作者jspivey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:06:13