使用.NET简单地从JPEG中删除EXIF数据的方法

18

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

我发现很多例子都是使用不同的库来读取和编辑EXIF数据,但我只需要一个简单的例子来删除它。

这只是为了测试目的,所以即使是最丑陋和破解的方法也会有帮助 :)

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


因为这个原因 - marc.d
你有没有考虑为此提供一些声望?这似乎是一项直截了当的苦工。 - Eric Smith
有趣的旧世界...我总是很担心会意外删除EXIF数据。 - Mark Pattison
4个回答

28

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

我的最终解决方案也更快捷,基本上是通过字节修补来删除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();
        }
      }
    }
  }
}

2
这个方案完美地运行了,但是使用 Bitmap 进行保存对我来说并不太适用。 - dance2die
Mikael,这是一个很棒的解决方案,但我有点好奇。在SkipAppHeaderSection(来自您的博客,而不是此处发布的代码)中,您正在成对迭代字节,并始终检查第一个是否为0xff,第二个是否在0xe00xef之间。这如何指示JPG头的开始和结束?最好奇的是为什么成对中的第一个总是0xe0 - oscilatingcretin
好久不见了,但我想我遇到过在exif之前有其他标头的图像,因此我循环直到找到具有正确签名0xff 0xe0的exif。 - Mikael Svenson

5
我认为将文件读入到Bitmap对象中,然后再写入到另一个文件中应该可以解决问题。
我记得在编写"图像旋转程序"时感到很沮丧,因为它删除了EXIF数据。但在这种情况下,这正是你想要的!

0

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


你说得对,解码/重新编码会损害质量(在某种程度上)。我认为这取决于发帖人根据自己的需求来决定是否值得这样做。 - Dave Van den Eynde
我看了一下,谢谢,但对于我的使用情况来说太复杂了。 - marc.d

-2

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

如果您想要的话,可以制作一个小批处理文件,例如: jhead.exe -purejpg *.jpg

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接