有没有人使用内部使用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“)。
AppFabric进行caching
如何获得这个词的音素?
Visual Studio ClickOnce部署是否自动包含必要的.NET框架?
CredUIPromptForCredentials强制手动select用户名
longitude和latitude应该是System.Double的数组, 但始终为NULL 。
使用“.Proxy”后缀的结果会返回奇怪的String数据,我不知道如何parsing它们,以及它们是否为文化不变性:MSDN文档告诉不同的东西,没有任何关于string的东西; 但至less在那里会有“有效的”经度和纬度的数据。
一些大胆和一些简单的话在同一个语句
什么编程实践影响窗口句柄的数量?
.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分钟。 所以你只需要把它转换成分钟和秒。