用 C# 从图片的 EXIF 信息中读取拍摄地点 GEO 坐标

本来觉得应该挺简单的一个事,没想到 EXIF 中记录的原始数据是 “度分秒” 格式的 byte[],而且还用到另一个 byte[] 记录东南西北方向。但现在许多 API 都是以 “度” 为单位的,例如 123.456789,要使用这些 API 还要转换一下格式。

找了几篇 StackOverflow 的帖子,把不同答案中最简练的部分提取出来,封装成一个简单的类,以备后用吧。

using System;
using System.Drawing;

public class GeoCoords
{

    // 纬度
    public double Latitude { get; set; }

    // 经度
    public double Longitude { get; set; }
    // 从图片的EXIF中读取经纬度
    public static Coords FromImage(Image image)
    {
        return new Coords()
        {
            Latitude = ReadCoord(image.GetPropertyItem(1).Value, image.GetPropertyItem(2).Value),
            Longitude = ReadCoord(image.GetPropertyItem(3).Value, image.GetPropertyItem(4).Value)
        };
    }
    // 读取坐标数据
    private static double ReadCoord(byte[] direction, byte[] coord)
    {
        var data = new uint[6];
        for (var i = 0; i < 6; i++)
            data[i] = BitConverter.ToUInt32(coord, i * 4);

        var dir = BitConverter.ToChar(direction, 0);
        var deg = data[0] / (double)data[1];
        var min = data[2] / (double)data[3];
        var sec = data[4] / (double)data[5];
        return Math.Round((((sec / 60 + min) / 60) + deg), 8) * ((dir == 'S' || dir == 'W') ? -1 : 1);
    }
}

上一篇: 中山纪念亭夜景

下一篇: 指尖陀螺入手