微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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“)。

如何将目录中的内容添加到C#中的ListBox

AppFabric进行caching

如何获得这个词的音素?

Visual Studio ClickOnce部署是否自动包含必要的.NET框架?

CredUIPromptForCredentials强制手动select用户名

longitude和latitude应该是System.Double的数组, 但始终为NULL

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

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

一些大胆和一些简单的话在同一个语句

一个小的.NET程序中pipe理临时文件

什么编程实践影响窗口句柄的数量

.Net程序为用户计算机上的所有图像编制索引的最快方法是什么?

如何指导创build一个uPNP iPhone应用程序?

我用这里的代码来访问经纬度: 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分钟。 所以你只需要把它转换成分钟和秒。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐