返回

.NET C#读取、修改与删除图片EXIF信息完整教程(System.Drawing + MetadataExtractor 实战)

2026-05-11 .NET C# EXIF 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处理是必不可少的一环。

顶部