使用元数据查询语言从JPEG文件的位图元数据中检索制造商注释

时间:2013-09-25 09:25:54

标签: c# .net metadata

如何使用元数据查询语言从图像中检索制造商注释?我正在尝试的图像是用尼康D300s拍摄的jpeg。

我已经能够获得EXIF和GPS数据了,但我不确定使用哪个IFD和查询字符串来查找制造商说明。

我尝试了各种不同的IFD(尼康,尼康3,尼康-3等)和查询,但无法检索到任何结果:

tagValueQuery = string.Format("/app1/ifd/Nikon3/subifd:{{ushort={0}}}", tag);
            if (metadata.ContainsQuery(tagValueQuery))
                return metadata.GetQuery(tagValueQuery);

我一直在使用本网站作为尼康标签编号的参考:http://gvsoft.homedns.org/exif/makernote-nikon-type3.html

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

要获取标准相机标签(FNumber,ExposureTime等)的EXIF值,我使用了MSDN上定义的列表 - 本机图像格式元数据查询(http://msdn.microsoft.com/en-us/library/ee719904%28VS.85%29.aspx) - 向下滚动,在EXIF元数据下可以获得标签的名称。

要获取标记的值,您需要添加“System.Photo”。在标签名称之前。例如,要获取FNumber,完整的标记名称为:“System.Photo.FNumber”。

我编写了以下帮助方法来读取EXIF数据:

public object GetMetadataValue(BitmapMetadata bitmapMetadata, string metadataQuery)
{
    object metadataValue;

    metadataQuery = "System.Photo." + metadataQuery;

    if (bitmapMetadata.ContainsQuery(metadataQuery))
        metadataValue = bitmapMetadata.GetQuery(metadataQuery);
    else
        metadataValue = null;

    return metadataValue;
}

public T GetMetadataValue<T>(BitmapMetadata bitmapMetadata, string metadataQuery)
{
    object metadataValue = GetMetadataValue(bitmapMetadata, metadataQuery);

    if (metadataValue != null && metadataValue.GetType() == typeof(T))
        return (T)metadataValue;

    return default(T);
}

public string GetMetadataText(BitmapMetadata bitmapMetadata, string metadataQuery)
{
    object metadataValue = GetMetadataValue(bitmapMetadata, metadataQuery);

    return metadataValue == null ? "" : metadataValue.ToString();
}

比FNumber可以简单地得到:

GetMetadataText(bitmapMetadate, "FNumber")

获得曝光时间有点棘手:

string exposureTimeText;
double exposureTime = GetMetadataValue<double>(bitmapMetadate, "ExposureTime");

if (exposureTime == 0.0)
    exposureTimeText = "";
else if (exposureTime < 1.0)
    exposureTimeText = string.Format("1/{0}s", 1 / exposureTime);
else
    exposureTimeText = string.Format("{0:0.0}s", exposureTime);