2013-06-05 21 views
5

Sto utilizzando l'eccellente ExifLib per estrarre i dati Exif dalle mie immagini su Windows Phone 8 (http://www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0). Tuttavia, a causa dei vincoli sulla privacy, devo essere in grado di eliminare i dati GPS exif dalle immagini importate dalla libreria fotografica dell'utente.Modifica/rimozione dei dati Exif Image su Windows Phone

Purtroppo non riesco a trovare un modo per modificare o rimuovere facilmente questi dati, eventuali puntatori o librerie che mi mancano?

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

4

C'è uno blog post here che mostra come rimuovere i dati EXIF ​​senza ricodificare l'immagine. Codice dal post

using System.IO; 

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) //check if it's a jpeg file 
      { 
       SkipAppHeaderSection(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 SkipAppHeaderSection(Stream inStream) 
     { 
      byte[] header = new byte[2]; 
      header[0] = (byte)inStream.ReadByte(); 
      header[1] = (byte)inStream.ReadByte(); 

      while (header[0] == 0xff && (header[1] >= 0xe0 && header[1] <= 0xef)) 
      { 
       int exifLength = inStream.ReadByte(); 
       exifLength = exifLength << 8; 
       exifLength |= inStream.ReadByte(); 

       for (int i = 0; i < exifLength - 2; i++) 
       { 
        inStream.ReadByte(); 
       } 
       header[0] = (byte)inStream.ReadByte(); 
       header[1] = (byte)inStream.ReadByte(); 
      } 
      inStream.Position -= 2; //skip back two bytes 
     } 
    } 
}