¿Biblioteca .NET C # para la reescritura Exif sin pérdida?

votos
10

He encontrado varios códigos y bibliotecas para editar Exif .

Pero solo son sin pérdida cuando el ancho y la altura de la imagen es múltiplo de 16.

Estoy buscando una biblioteca (o incluso una forma de hacerlo) para editar solo la porción Exif en un archivo JPEG (o agregar datos Exif si aún no existe), dejando los otros datos sin modificar. ¿No es eso posible?

Hasta ahora solo podía localizar la porción Exif (comienza con 0xFFE1) pero no entiendo cómo leer los datos.

Publicado el 24/06/2009 a las 14:01
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
8

Puedes hacer esto sin ninguna lib externa:

// Create image.
Image image1 = Image.FromFile("c:\\Photo1.jpg");

// Get a PropertyItem from image1. Because PropertyItem does not
// have public constructor, you first need to get existing PropertyItem
PropertyItem propItem = image1.GetPropertyItem(20624);

// Change the ID of the PropertyItem.
propItem.Id = 20625;

// Set the new PropertyItem for image1.
image1.SetPropertyItem(propItem);

// Save the image.
image1.Save("c:\\Photo1.jpg", ImageFormat.Jpg);

Lista de todos los identificadores de PropertyItem posibles (incluido exif) que puede encontrar aquí .

Actualización: de acuerdo, este método volverá a codificar la imagen al guardar. Pero he recordado otro método, en WinXP SP2 y más tarde hay nuevos componentes de imágenes agregados - WIC, y puede usarlos para metadatos de escritura sin pérdida - Cómo: Recodificar una imagen JPEG con metadatos .

Respondida el 24/06/2009 a las 20:12
fuente por usuario

votos
8

Aquí están las especificaciones para el formato de intercambio de Exif, si planea codificar su propia biblioteca para editar etiquetas.

http://www.exif.org/specifications.html

Aquí hay una biblioteca escrita en Perl que satisface sus necesidades de las que puede aprender:

http://www.sno.phy.queensu.ca/~phil/exiftool/

Aquí hay una biblioteca .NET decente para la evaluación Exif de The Code Project :

http://www.codeproject.com/KB/graphics/exiftagcol.aspx

Respondida el 24/06/2009 a las 14:30
fuente por usuario

votos
4

La biblioteca exiv2net (un contenedor .NET encima de exiv2) puede ser lo que estás buscando.

Respondida el 30/11/2009 a las 23:03
fuente por usuario

votos
0

Escribí una pequeña prueba en la que puedo comprimir un archivo muchas veces para ver la degradación de la calidad y se puede ver en la tercera a cuarta de compresión, que es muy malo.

Pero por suerte, si siempre utiliza misma QualityLevel con JpegBitmapEncoder no hay degradación.

En este ejemplo vuelvo a escribir palabras clave 100x en los metadatos y la calidad parece no cambiar.

private void LosslessJpegTest() {
  var original = "d:\\!test\\TestInTest\\20150205_123011.jpg";
  var copy = original;
  const BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile;

  for (int i = 0; i < 100; i++) {
    using (Stream originalFileStream = File.Open(copy, FileMode.Open, FileAccess.Read)) {
      BitmapDecoder decoder = BitmapDecoder.Create(originalFileStream, createOptions, BitmapCacheOption.None);

      if (decoder.CodecInfo == null || !decoder.CodecInfo.FileExtensions.Contains("jpg") || decoder.Frames[0] == null)
        continue;

      BitmapMetadata metadata = decoder.Frames[0].Metadata == null
        ? new BitmapMetadata("jpg")
        : decoder.Frames[0].Metadata.Clone() as BitmapMetadata;

      if (metadata == null) continue;

      var keywords = metadata.Keywords == null ? new List<string>() : new List<string>(metadata.Keywords);
      keywords.Add($"Keyword {i:000}");
      metadata.Keywords = new ReadOnlyCollection<string>(keywords);

      JpegBitmapEncoder encoder = new JpegBitmapEncoder {QualityLevel = 80};
      encoder.Frames.Add(BitmapFrame.Create(decoder.Frames[0], decoder.Frames[0].Thumbnail, metadata,
        decoder.Frames[0].ColorContexts));

      copy = original.Replace(".", $"_{i:000}.");

      using (Stream newFileStream = File.Open(copy, FileMode.Create, FileAccess.ReadWrite)) {
        encoder.Save(newFileStream);
      }
    }
  }
}
Respondida el 11/02/2016 a las 18:37
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more