2009-08-05 24 views
5

¿Cuál es la mejor manera de cambiar el tamaño de las imágenes usando .NET, sin perder los datos EXIF? Estoy de acuerdo con el uso de .NET 2 System.Drawing. * Clases, clases de WPF o bibliotecas de código abierto.Cambiar el tamaño de una imagen con .NET sin perder datos EXIF ​​

La única manera fácil que encontré para manejar esto por ahora es usar Graphics.FromImage (.NET 2) para realizar el cambio de tamaño y volver a escribir los datos EXIF ​​con una biblioteca OpenSource de forma manual (cada dato uno a uno).

+0

he añadido un proyecto en CodePlex, con el cambio de tamaño sin perder los datos EXIF: http://tidytinypics.codeplex.com/ – TigrouMeow

Respuesta

3

Su sugerencia de extraer los datos EXIF ​​antes de cambiar el tamaño, y luego volver a insertar los datos EXIF ​​parece ser una solución decente.

Los datos EXIF ​​se pueden definir solo para formatos como JPEG y TIFF: cuando carga una imagen de este tipo en un objeto Graphics para cambiar el tamaño, básicamente está convirtiendo la imagen en un mapa de bits normal. Por lo tanto, pierde los datos EXIF.

Tema ligeramente relacionado sobre la extracción EXIF ​​con C# here.

+0

me acuerdo Mantuve mi solución entonces, está funcionando bastante bien, es solo un montón de código para nada, pero es lo suficientemente rápido :) – TigrouMeow

+0

La única otra alternativa que conozco es ImageMagick - Entiendo que puedes hacer transformaciones sin perder datos EXIF, pero esa biblioteca es esencialmente haciendo lo mismo que ya estás haciendo, probablemente sea más rápido. –

2

he usado magia .NET y crearon 2 métodos de extensión:

public static byte[] ToByteArray(this Image imageIn) 
    { 
     MemoryStream ms = new MemoryStream(); 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     return ms.ToArray(); 
    } 

    public static Image AttachMetadData(this Image imgModified, Image imgOriginal) 
    { 
     using (MagickImage imgMeta = new MagickImage(imgOriginal.ToByteArray())) 
     using (MagickImage imgModi = new MagickImage(imgModified.ToByteArray())) 
     { 
      foreach (var profileName in imgMeta.ProfileNames) 
      { 
       imgModi.AddProfile(imgMeta.GetProfile(profileName)); 
      } 
      imgModified = imgModi.ToImage(); 
     } 
     return imgModified; 
    } 
Cuestiones relacionadas