有没有人使用内部使用 WIC(Windows 成像组件)的 WPF 类 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");
altitude
(System.Double)、altitudeRef
(System.Byte)、longitudeRef
(System.String) 和 的结果latitudeRef
(System.String) 都可以并检索到合理的数据(“510.70”、“0”、“N”、“E”)。
longitude
和 latitude
应该是 System.Double 的数组但它们始终为 NULL。
使用“.Proxy”后缀的结果返回奇怪的字符串数据,我不确定如何解析它们以及它们是否具有文化不变性:MSDN 文档讲述了一些不同的东西,与字符串无关;但至少那里会有经度和纬度的“有效”数据。
遗漏某些东西是错误还是我的错?
最佳答案
我使用这里的代码访问经纬度: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 格式。较新的格式在坐标上有更多的数字,因此它们被错误地转换。我必须将 Convert Coordinates 更新为:
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);
}
关于c# - WIC/WPF : System. GPS.Longitude 和 System.GPS.Latitude 总是返回 NULL(通过 BitmapMetadata),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25602481/