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

本文关键字:元数据 文件 注释 制作者 JPEG 位图 查询语言 检索 | 更新日期: 2023-09-27 18:32:53

如何使用元数据查询语言从图像中检索制作者注释?我正在尝试的图像是用尼康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。

感谢您的帮助!

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

获取标准相机标签(FNumber、曝光时间等)的 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);