.NET C#读取、修改与删除图片EXIF信息完整教程(System.Drawing + MetadataExtractor 实战)
2026-05-11 10 0
在数字图像处理中,EXIF(Exchangeable Image File Format)是非常重要的元数据格式,它记录了照片的拍摄信息,例如:拍摄时间、相机型号、光圈、ISO、GPS位置等。
在 .NET C# 开发中,我们经常需要对EXIF进行读取、修改或删除操作,例如:图片管理系统、相册应用、图片隐私处理工具等。
本文将从三种核心操作讲清楚:读取EXIF、修改EXIF、删除EXIF。
读取图片EXIF信息(C#实现)
方式1:使用 System.Drawing(简单但有限)
using System.Drawing;
using System.Drawing.Imaging;
var img = Image.FromFile("test.jpg");
foreach (PropertyItem item in img.PropertyItems)
{
Console.WriteLine($"ID: {item.Id}, Value Length: {item.Len}");
}
常见EXIF字段:
- 0x010F:相机品牌
- 0x0110:相机型号
- 0x9003:拍摄时间(DateTimeOriginal)
示例读取拍摄时间:
var prop = img.GetPropertyItem(0x9003);
string dateTaken = System.Text.Encoding.ASCII.GetString(prop.Value);
Console.WriteLine(dateTaken);
注意:System.Drawing 在跨平台 .NET(Linux/Mac)支持较弱,并且解析复杂EXIF较麻烦
方式2:推荐 MetadataExtractor(跨平台)
using MetadataExtractor;
using MetadataExtractor.Formats.Exif;
var directories = ImageMetadataReader.ReadMetadata("test.jpg");
var subIfd = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
var date = subIfd?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal);
Console.WriteLine(date);
优点:
- 支持 JPEG / PNG / TIFF / RAW
- API清晰
- 不依赖System.Drawing
该库被广泛用于 .NET EXIF 处理场景。
修改图片EXIF信息
方法1:使用第三方库(推荐)
.NET 原生 API 无法直接安全修改EXIF,通常需要第三方库,例如:
- MetadataExtractor(只读)
- GroupDocs.Metadata(可读写)
示例(修改标题):
using GroupDocs.Metadata;
using GroupDocs.Metadata.Formats.Image;
using (var metadata = new Metadata("test.jpg"))
{
var root = metadata.GetRootPackage<JpegRootPackage>();
root.ExifPackage.ImageDescription = "New Description";
metadata.Save("output.jpg");
}
方法2:System.Drawing重写保存法
思路:读取旧EXIF → 复制到新图 → 再保存。
Image img = Image.FromFile("test.jpg");
foreach (var prop in img.PropertyItems)
{
img.SetPropertyItem(prop);
}
img.Save("new.jpg", ImageFormat.Jpeg);
注意:
- 并不是所有字段都可写
- 容易丢失GPS或MakerNote数据
删除EXIF信息(隐私常用)
在实际开发中,删除EXIF信息通常用于:
- 上传前去隐私(GPS、设备信息)
- 图片压缩/发布系统
- 批量图片处理工具
删除EXIF本质上是移除图片中的元数据区(EXIF / IPTC / XMP)。
方法1:System.Drawing(基础方式)
通过重新生成图片对象,可以间接清除EXIF:
using System.Drawing;
using System.Drawing.Imaging;
using (Image img = Image.FromFile("input.jpg"))
{
Bitmap cleanImage = new Bitmap(img);
cleanImage.Save("output.jpg", ImageFormat.Jpeg);
}
特点:
- 操作简单
- 但可能降低画质或丢失部分信息
方法2:逐个移除EXIF属性(更精确)
using System.Drawing;
using (Image img = Image.FromFile("input.jpg"))
{
foreach (var item in img.PropertyItems)
{
img.RemovePropertyItem(item.Id);
}
img.Save("output.jpg");
}
特点:
- 更干净
- 但不一定能清除所有隐藏元数据(如XMP)
方法3:第三方库(推荐,最彻底)
在生产环境中,更推荐使用专业库,例如:
- MetadataExtractor(读取为主)
- GroupDocs.Metadata(完整读写/删除)
- ImageSharp(跨平台处理)
GroupDocs.Metadata 一键清除 EXIF(推荐)
这是最彻底的方式,可以直接移除 EXIF 包:
using GroupDocs.Metadata;
using GroupDocs.Metadata.Formats.Image;
using (var metadata = new Metadata("input.jpg"))
{
var root = metadata.GetRootPackage<JpegRootPackage>();
// 直接清除EXIF
root.ExifPackage = null;
metadata.Save("output.jpg");
}
特点:
- 一行代码清除 EXIF
- 同时影响 GPS、相机信息、拍摄时间
- 适合隐私清理工具
这种方式是企业级常用方案,可靠性高(官方也推荐这种方式处理 EXIF 清理)。
批量彻底清理所有元数据
如果你想一键清除所有 metadata(EXIF + XMP + IPTC):
using (Metadata metadata = new Metadata("input.jpg"))
{
metadata.Sanitize();
metadata.Save("output.jpg");
}
特点:
- 最彻底
- 会移除所有可识别元数据
- 适合隐私工具 / 上传前清理
实际开发建议(非常重要)
1. JPEG 才是EXIF主战场
- JPEG:完整支持EXIF
- PNG:通常没有标准EXIF
- WebP:部分支持
- RAW:依赖相机厂商扩展
2. 推荐技术栈选择
| 需求 | 推荐方案 |
|---|---|
| 只读取EXIF | MetadataExtractor |
| 修改EXIF | GroupDocs.Metadata |
| 批量清理EXIF | ImageMagick / 自定义工具 |
| 跨平台 | MetadataExtractor |
3. 常见问题
- EXIF时间格式需要解析(字符串不是DateTime)
- GPS数据是Rational结构(需要转换)
- System.Drawing 在 Linux 上可能依赖 libgdiplus
总结
在 .NET C# 中处理 EXIF,可以总结为:
- 读取EXIF:MetadataExtractor(推荐)
- 修改EXIF:GroupDocs.Metadata(最安全)
- 删除EXIF:重新保存或清空 PropertyItems
如果你在做图片工具(比如相册、压缩、隐私清理),EXIF处理是必不可少的一环。