C# WIC/WPF:System.GPS.Longitude和System.GPS.Latitude始终返回NULL(通过位图元数据)
是否有人使用内部使用WIC(Windows Imaging Component)的WPFs类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
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”