【问题标题】:Simple way to remove EXIF data from a JPEG with .NET使用 .NET 从 JPEG 中删除 EXIF 数据的简单方法
【发布时间】:2026-01-16 09:25:01
【问题描述】:

如何从 JPEG 图像中删除所有 EXIF 数据?

我找到了很多关于如何使用各种库读取和编辑 EXIF 数据的示例,但我需要的只是一个关于如何删除它的简单示例。

这只是为了测试建议,所以即使是最丑陋和黑客的方法也会有所帮助:)

我已经尝试搜索 EXIF 开始/结束标记 0xFFE1 和 0xFFE2。最后一个在我的情况下不存在。

【问题讨论】:

  • 您是否考虑过为此提供一些代表?它看起来很简单。
  • 有趣的旧世界...我总是偏执,我会不小心删除 EXIF 数据。

标签: .net exif


【解决方案1】:

我首先在我的博客中使用 WPF 库写过这个,但是由于 Windows 后端调用有点混乱,所以这种失败。

我的final solution 也快得多,它基本上是字节修补 jpeg 以删除 exif。快速简单:)

[编辑:博客文章有更多更新的代码]

namespace ExifRemover
{
  public class JpegPatcher
  {
    public Stream PatchAwayExif(Stream inStream, Stream outStream)
    {
      byte[] jpegHeader = new byte[2];
      jpegHeader[0] = (byte) inStream.ReadByte();
      jpegHeader[1] = (byte) inStream.ReadByte();
      if (jpegHeader[0] == 0xff && jpegHeader[1] == 0xd8)
      {
        SkipExifSection(inStream);
      }

      outStream.Write(jpegHeader,0,2);

      int readCount;
      byte[] readBuffer = new byte[4096];
      while ((readCount = inStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
        outStream.Write(readBuffer, 0, readCount);

      return outStream;
    }

    private void SkipExifSection(Stream inStream)
    {
      byte[] header = new byte[2];
      header[0] = (byte) inStream.ReadByte();
      header[1] = (byte) inStream.ReadByte();
      if (header[0] == 0xff && header[1] == 0xe1)
      {
        int exifLength = inStream.ReadByte();
        exifLength = exifLength << 8;
        exifLength |= inStream.ReadByte();

        for (int i = 0; i < exifLength - 2; i++)
        {
          inStream.ReadByte();
        }
      }
    }
  }
}

【讨论】:

  • 这很有效,而使用 Bitmap 保存对我来说不太有效。
  • Mikael,这是一个很棒的解决方案,但我对某些事情感到好奇。在SkipAppHeaderSection(来自您的博客,而不是此处发布的代码)中,您将成对地遍历字节并始终检查第一个字节是否为0xff,以及第二个字节是否介于0xe00xef 之间。这如何指示 JPG 标头的开始和结束?最奇怪的是为什么这对中的第一个总是0xe0
  • 已经很长时间了,但我想我遇到了在 exif 之前有其他标题的图像,因此我循环直到找到正确签名为 0xff 0xe0 的 exif
【解决方案2】:

我认为将文件读入位图对象并再次写入文件应该可以解决问题。

我记得在执行我的“图像旋转程序”时感到沮丧,因为它删除了 EXIF 数据。但在这种情况下,这正是你想要的!

【讨论】:

    【解决方案3】:

    您应该避免对图像进行解码和重新编码,因为这会损害图像质量。相反,您应该找到一种仅修改元数据的方法。我还没有尝试过,但我认为InPlaceBitmapMetadataWriter 可以解决问题。

    【讨论】:

    • 你说得对,解码/重新编码会损害质量(在某种程度上)。我认为这取决于发布者根据他的需要来决定是否值得付出努力。
    • 我查看了它,但对于我的用例来说,这有点复杂。
    【解决方案4】:

    太简单了,从这里使用jhead.exe:http://www.sentex.net/~mwandel/jhead/

    如果需要,请制作一个小批处理文件,例如: jhead.exe -purejpg *.jpg

    它将从同一文件夹中的所有 jpeg 中删除所有元数据。

    【讨论】: