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

StackOverflow https://stackoverflow.com/questions/1005463

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Впервые я написал об этом с использованием библиотек 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();
        }
      }
    }
  }
}

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

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

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

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

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

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

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

Редактировать:Возможно, все же стоит изучить пакетные операции в пакетах paint (а не в пакетах для обработки фотографий, поскольку они с большей вероятностью сохраняют данные EXIF) и посмотреть, можно ли их автоматизировать.Затем вы можете написать скрипт / пакетный файл для обработки ваших изображений.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top