Вопрос по .net – Простой способ удалить данные EXIF из JPEG с помощью .NET

13

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

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

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

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

Забавный старый мир ... Я всегда параноик, что собираюсь случайно удалить данные EXIF. Mark Pattison
Зачем тебе это нужно? Eric Smith
Рассматривали ли вы предложение некоторых представителей для этого? Похоже на простое хрюканье. Eric Smith
из-за этогоstackoverflow.com/questions/1001537/… marc.d

Ваш Ответ

5   ответов
0

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

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

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

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

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

& quot; но его можно свернуть, написав с минимальным сжатием. & quot; на самом деле, это правда, но вы получите файл, который больше оригинала.
@ChrisF: Да, это действительно решит проблему. :П
к сожалению, это каждая фотография, сделанная с этой моделью камеры и, возможно, также с другими моделями marc.d
Вы обращались к производителю камеры - звучит как ошибка в их прошивке.
Но они могут знать об этом и предложить обходной путь. Извините, я должен был указать это в своем первоначальном комментарии.
6

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

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

я ушел с этим подходом сейчас, спасибо. marc.d
0

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

Я посмотрел на это, спасибо, но это сложный для моего случая использования. marc.d
23

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

мойокончательное решение также намного быстрее, который в основном байт исправляет JPEG, чтобы удалить EXIF. Быстро и просто :)

[EDIT: Blog post has more updated code]

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();
        }
      }
    }
  }
}
Микаэль, это отличное решение, но мне интересно кое-что. ВSkipAppHeaderSection (из вашего блога, а не кода, размещенного здесь), вы повторяете байты попарно и всегда проверяете, является ли первый0xff и если второй между0xe0 а также0xef, Как это указывает на начало и конец заголовка JPG? Самое любопытное, почему первым в паре всегда будет0xe0.
Это отлично работало, в то время как сохранение с использованием растрового изображения не работало для меня.
Прошло много времени, но я думаю, что я столкнулся с изображениями, которые имели другие заголовки перед exif, поэтому я зацикливался, пока не нашел exif с правильной сигнатурой 0xff 0xe0
1

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

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

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

Похожие вопросы