Domanda

Come posso rimuovere tutti i dati EXIF ??da un'immagine JPEG?

Ho trovato molti esempi su come leggere e modificare i dati EXIF ??con varie librerie, ma tutto ciò di cui avrei bisogno è un semplice esempio su come rimuoverlo.

È solo per le proposte di test, quindi anche l'approccio più brutto e truccato sarebbe utile :)

Ho già provato a cercare i marker di inizio / fine EXIF ??0xFFE1 & amp; 0xFFE2. L'ultimo non esiste nel mio caso.

È stato utile?

Soluzione

Penso che leggere il file in un oggetto Bitmap e scrivere di nuovo su un file dovrebbe fare il trucco.

Ricordo di essermi sentito frustrato mentre svolgevo il mio programma di rotazione delle immagini " che ha rimosso i dati EXIF. Ma in questo caso, è esattamente quello che vuoi!

Altri suggerimenti

Ho scritto per la prima volta su questo usando le librerie WPF nel mio blog, ma questo tipo di errore è fallito poiché le chiamate back-end di Windows sono un po 'incasinate.

La mia soluzione finale è anche molto più veloce che fondamentalmente byte corregge il jpeg per rimuovere exif. Veloce e semplice :)

[EDIT: il post sul blog ha un codice più aggiornato]

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

È troppo facile, usa jhead.exe da qui: http://www.sentex.net / ~ mwandel / jhead /

Crea un piccolo file batch se vuoi ad es .: jhead.exe -purejpg * .jpg

Rimuoverà tutti i metadati da tutti i jpeg nella stessa cartella.

ciò che dovresti evitare è decodificare e ricodificare le tue immagini perché ciò danneggerebbe la qualità. invece dovresti trovare un modo per modificare solo i metadati. non l'ho provato ma penso InPlaceBitmapMetadataWriter farà il trucco.

Se è l'unico file che hai provato a leggere in un pacchetto di vernice come Paint.NET o Paint Shop Pro e a salvarlo come nuovo file?

Potrebbe essere necessario copiare prima l'immagine in un nuovo file.

Ovviamente se ci sono molti file, questo potrebbe non essere l'approccio migliore;). Sebbene abbia detto che Paint Shop Pro ha un'opzione di conversione batch che potrebbe valere la pena di indagare.

MODIFICA: potrebbe comunque valere la pena di esaminare le operazioni batch nei pacchetti di vernice (piuttosto che i pacchetti di manipolazione fotografica in quanto è più probabile che conservino i dati EXIF) e vedere se possono essere automatizzati. È quindi possibile scrivere un file di script / batch per elaborare le immagini.

In questo caso si applicherà il commento di iik sulla lettura e scrittura del file che degrada l'immagine, ma può essere minimizzato scrivendo con una compressione minima.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top