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

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

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

Я уже пробовал поиск маркеров начала/конца EXIF ​​0xFFE1 и 0xFFE2, последний не существует в моем случае 0_o

TIA

Ответ 1

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

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

Ответ 2

Впервые я написал об этом, используя библиотеки WPF в своем блоге, но этот сорт не удался, поскольку вызовы backend Windows немного перепутаны.

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

[EDIT: сообщение в блоге имеет более обновленный код]

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.WriteByte(0xff);
      outStream.WriteByte(0xd8);

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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