在C#中读取图片的EXIF信息,可以借助System.Drawing命名空间下的PropertyItem机制,直接获取照片的拍摄时间与GPS经纬度,而不必引入庞大的第三方库。下面通过示例说明具体做法。

一、准备工作和基本原理
JPEG图片常把拍摄参数存于EXIF中。C#用Image类加载图片后,可通过PropertyItems拿到所有属性项。每个项有Id标识含义,如拍摄时间为0x9003,GPS纬度为0x0002等。
二、读取拍摄时间
拍摄时间一般存为ASCII字符串,对应Id是0x9003(DateTimeOriginal)。下面代码演示如何读取:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
class ExifDemo
{
static void Main()
{
// 加载图片,路径换成你自己的文件
Image img = Image.FromFile(@"C:test.jpg");
// 遍历属性查找拍摄时间
foreach (PropertyItem pi in img.PropertyItems)
{
if (pi.Id == 0x9003)
{
string time = Encoding.ASCII.GetString(pi.Value).Trim(' ');
Console.WriteLine("拍摄时间: " + time);
}
}
img.Dispose();
}
}
三、读取GPS经纬度
GPS信息分纬度、经度,各有度分秒三个有理数存在字节数组里,参考0x0001表示南北纬。以下示例读取纬度:
using System;
using System.Drawing;
using System.Drawing.Imaging;
class GpsDemo
{
static double ToDouble(byte[] val)
{
// 每个经纬度值由分子和分母8字节组成,这里简化取第一个
long den = BitConverter.ToInt32(val, 4);
long num = BitConverter.ToInt32(val, 0);
return den == 0 ? 0 : (double)num / den;
}
static void Main()
{
Image img = Image.FromFile(@"C:test.jpg");
double lat = 0;
foreach (PropertyItem pi in img.PropertyItems)
{
if (pi.Id == 0x0002) // GPSLatitude
{
lat = ToDouble(pi.Value) + ToDouble(new byte[8]) * 0; // 示意,实际应拼合度分秒
Console.WriteLine("纬度数值: " + lat);
}
}
img.Dispose();
}
}
四、注意事项
- 并非所有图片都有GPS信息,手机拍的通常有,电脑截屏没有。
- PropertyItem的Value是原始字节,需按EXIF规范转换。
- 处理完Image要调用Dispose释放资源。
实际项目里建议封装一个方法,把经纬度度分秒合成为小数度数,再结合地图接口使用。
五、小结
用C#读取EXIF的拍摄时间和GPS经纬度并不复杂,核心就是认准PropertyItem的Id并正确解析字节。掌握后就能做自己的照片整理工具。