2016-04-06 12 views
1

Ich verwende Magick.NET Bibliothek zum Lesen von Exif-Werten. Für die höchste Leistung verwende ich die Methode Ping (siehe this), da ich bei der Arbeit mit einigen Bildmetadaten keinen tatsächlichen Bildinhalt benötige.Add Tag-Wert zu bestehenden Exif-Profil in Bild

Aber jetzt muss ich Exif-Tag-Wert schreiben, wenn dieser Wert nicht existiert. Was ich versuche zu tun:

public static void Test() 
    { 
     var path = @"C:\image.jpg"; 

     using (var image = new MagickImage()) 
     { 
      image.Ping(path); 

      var profile = image.GetExifProfile(); 

      var copyright = profile.Values.FirstOrDefault(x => x.Tag == ExifTag.Copyright); 
      if (copyright != null) 
      { 
       Trace.WriteLine("Copyright: " + copyright); 
      } 
      else 
      { 
       Trace.WriteLine("Write Copyright data"); 

       profile.SetValue(ExifTag.Copyright, "Example text"); 
       image.AddProfile(profile, true); 
       image.Write(path); 
      } 
     } 
    } 

Aber dieser Code ist nicht Schreiben Tag-Wert exif. Ich kann erfolgreich Tag-Wert schreiben, wenn Datei eine andere Art und Weise zu öffnen (wie in diesem answer):

 var path = @"C:\image.jpg"; 

     // Read image with content 
     using (var image = new MagickImage(path)) 
     { 
      // image.Ping(path) - no more need 
      var profile = image.GetExifProfile(); 

      ... 
     } 

Aber diese dekodieren ganze Bildinhalt, ich brauche es nicht für Werte von ‚content-unabhängigen‘ Tags zu ändern wie Copyright oder DateTimeDigitated.

Die Frage ist: wie man bearbeiten dieses EXIF-Tags ohne Laden ganzen Bildinhalt?
Und muss ich ganze Exif Profil umschreiben (image.AddProfile(profile, true)) oder gibt es eine Möglichkeit, nur Profil bearbeiten?

Antwort

2

Leider gibt es keine Möglichkeit, dies in Magick.NET zu tun. Sie müssen alle Pixel des Bildes mit .Read lesen, wenn Sie das Bild schreiben möchten. Die Methode .Ping sollte nur verwendet werden, wenn Sie Informationen aus dem Bild erhalten möchten, ohne das gesamte Bild zu laden.

Es gibt keine Möglichkeit, nur einen Wert zu ersetzen/zu bearbeiten. Sie ersetzen das Profil korrekt. Sie benötigen jedoch nicht die true, da dies der Standardwert für AddProfile ist.

Es könnte eine andere Bibliothek geben, die Ihnen dabei helfen könnte. Sie können auch die JPEG-Spezifikationen lesen und die Position des EXIF-Profils in Ihrer Datei finden. Verwenden Sie dann die ExifProfile-Klasse, um sie zu ändern und in das Bild zurückzuschreiben. Ich überlasse diesen Teil als Übung für den Leser.

Es ist auch nicht sehr wahrscheinlich, dass diese Funktion in ImageMagick endet, denn das würde bedeuten, dass wir die Art, wie wir Bilder kodieren und decodieren, neu schreiben müssten. Als Maintainer von Magick.NET könnte ich diese zusätzliche Funktion in Zukunft hinzufügen. Ich habe bereits ImageOptimizer geschrieben, die verwendet werden können, um die Größe von JPG/PNG-Bildern zu reduzieren, die nicht Teil von ImageMagick sind. Aber ich kann dir nicht sagen, wann das verfügbar sein wird.

+0

Ich vermutete so etwas, aber danke für die Bestätigung der Informationen. Nachdem ich die JPEG-Spezifikationen erhalten habe, bin ich zu dem Schluss gekommen, dass es definitiv besser ist, ein bestimmtes, gut unterstütztes Tool anstelle von manuellen Eingriffen in jpeg zu verwenden. Letzte Frage: Wenn es technisch möglich ist - wie sehen die Chancen aus? Funktion wie 'exif edit ohne Inhalt laden' in Magick.NET? – Sam

+0

Ich habe die Antwort aktualisiert, um diese Frage zu beantworten. – dlemstra

+0

Nun, diese Funktion scheint nicht so einfach zu implementieren, wie ich dachte, also werden wir eine andere Möglichkeit finden, die Exif-Bearbeitung für eine Weile zu verstärken. Aber wir werden uns freuen, dieses Feature in Zukunft zu sehen :) Trotzdem, vielen Dank für eure Antworten und für Magick.NET überhaupt! – Sam

Verwandte Themen