13

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

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

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

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

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

  • Микаэль, это отличное решение, но мне интересно кое-что. ВSkipAppHeaderSection (из вашего блога, а не кода, размещенного здесь), вы повторяете байты попарно и всегда проверяете, является ли первый0xff и если второй между0xe0 а также0xef, Как это указывает на начало и конец заголовка JPG? Самое любопытное, почему первым в паре всегда будет0xe0.

    от
  • & quot; но его можно свернуть, написав с минимальным сжатием. & quot; на самом деле, это правда, но вы получите файл, который больше оригинала.

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

    от
  • Прошло много времени, но я думаю, что я столкнулся с изображениями, которые имели другие заголовки перед exif, поэтому я зацикливался, пока не нашел exif с правильной сигнатурой 0xff 0xe0

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

    от marc.d
  • Это отлично работало, в то время как сохранение с использованием растрового изображения не работало для меня.

    от
  • @ChrisF: Да, это действительно решит проблему. :П

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

    от marc.d
  • Вы обращались к производителю камеры - звучит как ошибка в их прошивке.

    от
  • к сожалению, это каждая фотография, сделанная с этой моделью камеры и, возможно, также с другими моделями

    от marc.d
  • Забавный старый мир ... Я всегда параноик, что собираюсь случайно удалить данные EXIF.

    от Mark Pattison
  • Рассматривали ли вы предложение некоторых представителей для этого? Похоже на простое хрюканье.

    от Eric Smith
  • из-за этогоstackoverflow.com/questions/1001537/…

    от marc.d
  • Зачем тебе это нужно?

    от Eric Smith
5 ответов
  • 6

    Я думаю

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

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

  • 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();
            }
          }
        }
      }
    }
    

  • 0

    Если это единственный файл

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

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

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

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

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

  • 0

    что вам следует избегать

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

  • 1

    Это слишком просто, используйте jhead.exe отсюда:

    http://www.sentex.net/~mwandel/jhead/

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

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