Простой способ удалить данные EXIF ​​из JPEG с помощью .NET - PullRequest
14 голосов
/ 17 июня 2009

Как я могу удалить все данные EXIF ​​из изображения JPEG?

Я нашел много примеров того, как читать и редактировать данные EXIF ​​с различными библиотеками, но все, что мне нужно, это простой пример того, как их удалить.

Это только для тестирования предложений, так что даже самый уродливый и взломанный подход был бы полезен:)

Я уже пытался найти маркеры начала / конца EXIF ​​0xFFE1 и 0xFFE2. Последний не существует в моем случае.

Ответы [ 5 ]

24 голосов
/ 09 августа 2009

Я впервые написал об этом с помощью библиотек WPF в своем блоге, но такого рода не получилось, поскольку внутренние вызовы Windows немного запутались.

Мое окончательное решение также намного быстрее, который в основном байт исправляет 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();
        }
      }
    }
  }
}
6 голосов
/ 17 июня 2009

Я думаю, что чтение в файле в объект Bitmap и запись в файл снова должны помочь.

Я помню, как расстроился, когда выполнял свою "программу поворота изображения", что он удалил данные EXIF. Но в данном случае это именно то, что вы хотите!

1 голос
/ 09 февраля 2011

Это слишком просто, используйте jhead.exe отсюда: http://www.sentex.net/~mwandel/jhead/

Создайте небольшой пакетный файл, например: jhead.exe -purejpg *.jpg

Он удалит все метаданные из всех файлов JPEG в одной папке.

0 голосов
/ 17 июня 2009

что вам следует избегать, это декодировать и перекодировать ваши изображения, потому что это ухудшит качество. Вместо этого вы должны найти способ изменить только метаданные. я не пробовал, но думаю, InPlaceBitmapMetadataWriter поможет.

0 голосов
/ 17 июня 2009

Если вы пытались прочитать только один файл в пакете для рисования, например Paint.NET или Paint Shop Pro, и сохранить его как новый файл?

Возможно, вам сначала потребуется скопировать изображение в новый файл.

Конечно, если файлов много, это может быть не лучшим подходом;). Хотя в Paint Shop Pro есть опция пакетной конвертации, которую стоит изучить.

РЕДАКТИРОВАТЬ: Возможно, стоит исследовать пакетные операции в пакетах рисования (а не в пакетах с фото-манипуляциями, поскольку они с большей вероятностью сохранят данные EXIF) и посмотреть, можно ли их автоматизировать. Затем вы можете написать скрипт / пакетный файл для обработки ваших изображений.

Комментарий iik о чтении и записи файла, ухудшающего изображение, будет применяться в этом случае, но может быть минимизирован путем записи с минимальным сжатием.

...