2009-08-05 5 views
5

Was ist der beste Weg, um Bilder mit .NET zu skalieren, ohne die EXIF-Daten zu verlieren? Ich bin in Ordnung mit .NET 2 System.Drawing. * -Klassen, WPF-Klassen oder Open-Source-Bibliotheken.Größe eines Bildes mit .NET ändern, ohne EXIF-Daten zu verlieren

Die einzige einfache Möglichkeit, dies zu tun, ist die Verwendung von Graphics.FromImage (.NET 2), um die Größenänderung durchzuführen und die EXIF-Daten manuell mit einer OpenSource-Bibliothek neu zu schreiben (jedes Datenelement) Einer nach dem anderen).

+0

ich ein Projekt auf CodePlex hinzugefügt, um die Größenänderung mit, ohne dass die EXIF-Daten zu verlieren: http://tidytinypics.codeplex.com/ – TigrouMeow

Antwort

3

Ihr Vorschlag, die EXIF-Daten vor der Größenanpassung zu extrahieren und dann die EXIF-Daten erneut einzufügen, scheint eine anständige Lösung zu sein.

EXIF-Daten können nur für Formate wie JPEG und TIFF definiert werden - wenn Sie ein solches Bild zum Ändern der Größe in ein Graphics-Objekt laden, konvertieren Sie das Bild im Wesentlichen in eine normale Bitmap. Daher verlieren Sie die EXIF-Daten.

Leicht verwandten Thread über EXIF-Extraktion mit C# here.

+0

Okay, ich Meine Lösung ist dann, es funktioniert ganz gut, es ist nur eine Menge Code für nichts aber es ist schnell genug :) – TigrouMeow

+0

Die einzige andere Alternative, die ich kenne, ist ImageMagick - Ich verstehe, dass Sie Transformationen ohne Verlust von EXIF-Daten tun können, aber diese Bibliothek ist im Wesentlichen tun Sie das gleiche, was Sie bereits tun, nur wahrscheinlich schneller. –

2

verwendet I Magick .NET und erstellt zwei Erweiterungsmethoden:

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