C# WIC/WPF:System.GPS.Longitude和System.GPS.Latitude始终返回NULL(通过位图元数据)

C# WIC/WPF:System.GPS.Longitude和System.GPS.Latitude始终返回NULL(通过位图元数据),c#,.net,wpf,windows,wic,C#,.net,Wpf,Windows,Wic,是否有人使用内部使用WIC(Windows Imaging Component)的WPFs类BitmapMetadata成功读取GPS数据 我有一个图像,其中Windows(8.1)资源管理器和XnView等外部工具都显示GPS坐标 我尝试使用类BitmapMetadata提取这些数据,该类可通过类BitmapFrame的属性Metadata获得: var md = (BitmapMetdata)extractedFrame.Metadata; var altitude = md.GetQuer

是否有人使用内部使用WIC(Windows Imaging Component)的WPFs类
BitmapMetadata
成功读取GPS数据

我有一个图像,其中Windows(8.1)资源管理器和XnView等外部工具都显示GPS坐标

我尝试使用类
BitmapMetadata
提取这些数据,该类可通过类
BitmapFrame
的属性
Metadata
获得:

var md = (BitmapMetdata)extractedFrame.Metadata;
var altitude = md.GetQuery("System.GPS.Altitude");
var altitudeProxy = md.GetQuery("System.GPS.Altitude.Proxy");
var altitudeRef = md.GetQuery("System.GPS.AltitudeRef");
var longitude = md.GetQuery("System.GPS.Longitude");
var longitudeProxy = md.GetQuery("System.GPS.Longitude.Proxy");
var longitudeRef = md.GetQuery("System.GPS.LongitudeRef");
var latitude = md.GetQuery("System.GPS.Latitude");
var latitudeProxy = md.GetQuery("System.GPS.Latitude.Proxy");
var latitudeRef = md.GetQuery("System.GPS.LatitudeRef");
altitudeRef
(System.Double)、
altitudeRef
(System.Byte)、
longitudeRef
(System.String)和
latitudeRef
(System.String)的结果都正常,并检索到合理的数据(“510.70”、“0”、“N”、“E”)

经度
纬度
应该是系统的数组。Double但它们总是空的

使用“.Proxy”后缀的结果返回奇怪的字符串数据,我不是舒尔。如何解析这些数据,以及它们是否具有区域性不变:MSDN文档说明了一些不同的内容,而与字符串无关;但至少那里有经度和纬度的“有效”数据


这是一个错误还是我遗漏了什么?

我使用这里的代码访问纬度和经度: 但它不能处理N、S、E、W+/-部分。因此,您必须使用上面的LongitudeRef和LatitudeRef来确定是否要更改坐标上的符号。 基本上:

JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapMetadata meta = (BitmapMetadata)decoder.Frames[0].Metadata;
ulong[] latitude    = meta.GetQuery("/app1/ifd/gps/subifd:{ulong=2}") as ulong[];
ulong[] longitude   = meta.GetQuery("/app1/ifd/gps/subifd:{ulong=4}") as ulong[];
double lat          = ConvertCoordinate(latitude);
double longit       = ConvertCoordinate(longitude);

static double ConvertCoordinate(ulong[] coordinates)
{
    int lDash   = (int)(coordinates[0] - ((ulong)0x100000000));
    int lF      = (int)(coordinates[1] - ((ulong)0x100000000));
    double lR   = ((double)(coordinates[2] - ((ulong)0x6400000000))) / 100;
    double tRes = (lDash + (((double)lF) / 60)) + (lR / 3600);
    return (Math.Floor((double)(tRes * 1000000)) / 1000000);
}
编辑以上仅适用于较旧的EXIF格式。较新的格式在坐标上有更多的数字,因此它们被错误地转换。我必须将转换坐标更新为:

static double ConvertCoordinate(ulong[] coordinates)
{
    if (coordinates == null)
        return 0;

    double degrees = ConvertToUnsignedRational( coordinates[ 0 ] ); 
    double minutes = ConvertToUnsignedRational( coordinates[ 1 ] ); 
    double seconds = ConvertToUnsignedRational( coordinates[ 2 ] ); 
    return degrees + (minutes / 60.0) + (seconds / 3600); 

}
static double ConvertToUnsignedRational( ulong value ) 
{ 
    return (value & 0xFFFFFFFFL) / (double) ((value & 0xFFFFFFFF00000000L) >> 32); 
} 

现在回答可能太晚了,但.Proxy值的格式如下:

MetaDataValue   "16,0.4965000000000145E"    object {string}

表示16度,0.49分钟。所以你只需要把它转换成分和秒。

@StefanFalk这是答案,不是问题。如果你是反对者,我建议你回复,因为答案确实返回了合理的值。@springy76我很抱歉!我在复习时犯了那个错误,认为这是一个实际的问题!我将撤消我的否决票,但我必须等到她接受我的编辑,因为SO在那之前锁定了我的投票决定。顺便说一句:
meta.GetQuery()
还有两个额外的键,它也可以返回
ulong[]
:“/xmp/exif:GPSLatitude”和“/xmp/exif:GPSLongitude”