WIC / WPF:System.GPS.Longitude和System.GPS.Latitude始终返回NULL(通过BitmapMetadata)

有没有人使用内部使用WIC(Windows图像组件)的WPF类BitmapMetadata成功读取GPS数据?

我有一个图像,Windows(8.1)资源pipe理器和外部工具,如XnView显示GPS坐标。

我试图提取这些数据使用类BitmapMetadata可以通过属性MetadataBitmapFrame

 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"); 

altitude (System.Double), altitudeRef (System.Byte), longitudeRef (System.String)和latitudeRef (System.String)的结果都是正确的,并检索合理的数据(“510.70”,“0”,“N”,“ E“)。

longitudelatitude应该是System.Double的数组, 但始终为NULL

使用“.Proxy”后缀的结果会返回奇怪的String数据,我不知道如何parsing它们,以及它们是否为文化不变性:MSDN文档告诉不同的东西,没有任何关于string的东西; 但至less在那里会有“有效的”经度和纬度的数据。

错过了什么是错误还是错误?

我用这里的代码来访问经纬度: http : //khason.net/blog/how-to-read-gps-metadata-from-image/它不处理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分钟。 所以你只需要把它转换成分钟和秒。