如何用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
相关产品推荐
相关产品推荐

