0

メタデータ クエリ言語を使用して、画像からメーカー ノートを取得するにはどうすればよいですか? 私が試している画像は、ニコン D300s で撮影した jpeg です。

EXIF と GPS データは正常に取得できましたが、メーカー ノートを見つけるためにどの IFD とクエリ文字列を使用すればよいかわかりません。

さまざまな IFD (Nikon、Nikon3、Nikon-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の Web サイトを参照してきました。

助けてくれてありがとう!

4

1 に答える 1

1

標準のカメラ タグ (FNumber、ExposureTime など) の EXIF 値を取得するために、MSDN - Native Image Format Metadata Queries ( 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);
于 2013-12-26T20:09:55.430 に答える