2009-06-17 15 views
11

cómo puedo eliminar todos los datos EXIF ​​de un JPEG, encontré muchos ejemplos de cómo leer y editar los datos EXIF ​​con varias librerías, pero todo lo que necesitaría es un simple ejemplo cómo eliminarlo.manera simple de eliminar datos EXIF ​​de un JPEG con .NET

es sólo para las pruebas proponer lo que incluso el enfoque más fea y hackished sería de gran ayuda :)

Ya he intentado buscar el inicio EXIF ​​/ marcadores finales 0xFFE1 & 0xFFE2, este último no existe en mi caso 0_o

tia

+0

¿Por qué necesita hacer esto? –

+0

debido a esto http://stackoverflow.com/questions/1001537/localreport-render-fails-with-images-from-nikon-coolpix-5600 –

+0

¿Ha considerado ofrecer algún representante para esto?Parece un trabajo gruñido directo. –

Respuesta

7

Creo que leer el archivo en un objeto de mapa de bits y escribir de nuevo en un archivo debería ser el truco.

Recuerdo sentirme frustrado al hacer mi "programa de rotación de imagen" que eliminó los datos EXIF. ¡Pero en este caso, es exactamente lo que quieres!

+1

Me he ido con este enfoque por ahora, gracias. –

0

Si es sólo un archivo has de leer en un paquete de pintura como Paint.NET o Paint Shop Pro y volver a guardar como un nuevo archivo?

Es posible que primero tenga que copiar la imagen a un archivo nuevo.

Por supuesto, si hay muchos archivos, este podría no ser el mejor enfoque;). Aunque dijo que Paint Shop Pro tiene una opción de conversión por lotes que podría valer la pena investigar.

EDITAR: Todavía podría valer la pena investigar las operaciones por lotes en paquetes de pintura (en lugar de paquetes de manipulación de fotografías, ya que es más probable que conserven los datos EXIF) y ver si se pueden automatizar. A continuación, puede escribir un script/archivo por lotes para procesar sus imágenes.

El comentario de iik sobre leer y escribir el archivo que degrada la imagen se aplicará en este caso, pero se puede minimizar escribiendo con una compresión mínima.

+0

desafortunadamente es cada foto tomada con ese modelo de cámara y tal vez también con otros modelos –

+0

Ha contactado al fabricante de la cámara - parece un error en su firmware. – ChrisF

+0

@ChrisF: Sí, eso realmente va a resolver el problema. : P –

1

lo que debe evitar es decodificar y recodificar sus imágenes porque esto dañará la calidad. en su lugar, debe encontrar una forma de modificar solo los metadatos. No lo he intentado pero creo que InPlaceBitmapMetadataWriter hará el truco.

+0

Tiene razón en que decodificar/recodificar dañará la calidad (hasta cierto punto). Creo que depende del aficionado decidir si vale la pena el esfuerzo en función de lo que necesita. –

+0

lo analicé, pero es complicado para mi caso de uso. –

20

La primera vez que escribí sobre esto fue que usé las librerías WPF en mi blog, pero este tipo de error se debe a que las llamadas al back-end de Windows están un poco desordenadas.

Mi final solution es también mucho más rápido, que básicamente parchea el jpeg para eliminar el exif. Rápido y sencillo :)

[EDIT: Código Blog post ha actualizado más]

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

Esto funcionó perfectamente mientras que guardar usando Bitmap no me funcionó del todo. – Sung

1

es demasiado fácil, el uso jhead.exe desde aquí: http://www.sentex.net/~mwandel/jhead/

hacer un pequeño archivo por lotes si desea, por ejemplo: jhead.exe -purejpg *.jpg

Se quitarán todos los metadatos de todos los archivos JPEG en la misma carpeta.

Cuestiones relacionadas