c# - WIC/WPF : System. GPS.Longitude 和 System.GPS.Latitude 总是返回 NULL(通过 BitmapMetadata)

标签 c# .net wpf windows wic

有没有人使用内部使用 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”)。

longitudelatitude 应该是 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/

相关文章:

c# - 在 ASP.NET5 控制台应用程序中使用 Startup 类

javascript - 在 AWS lambda 函数中从 s3 分块读取 csv 文件

c# - 从 WinForms GUI 线程调用 COM 线程上的方法时出现问题?

c# - WPF 中的命名命令

c# - 更改代码优先 EF4 中的列名称约定

c# - 商业 WPF 应用程序的映射

c# - 我的 C# 评分程序一直输出相同的结果

c# - "There is a duplicate ' system.web.extensions/脚本/scriptResourceHandler ' section defined"

c# - WPF转换器无法正常工作

c# - 如果 c# 不工作,则使用测试字符串类型的对象属性