2016-04-06 80 views
1

我使用Magick.NET庫來讀取exif值。爲了獲得最高性能,我使用Ping方法(請參閱this),因爲在處理某些圖像元數據時,我不需要實際的圖像內容。將標記值添加到圖像中的現有exif配置文件

但是現在我需要編寫exif標籤值,如果這個值不存在。我想要做的事:

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

但這代碼寫標籤值EXIF。 (在此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(); 

      ... 
     } 

但這解碼整個圖像內容,我並不需要它改變自主內容「標籤值如版權DateTimeDigitized

問題是:如何編輯此exif標籤沒有加載整個圖像內容?
我是否需要重寫整個exif配置文件(image.AddProfile(profile, true))或有一些方法來編輯配置文件?

回答

2

不幸的是,在Magick.NET中沒有辦法做到這一點。如果要編寫圖像,則需要使用.Read讀取圖像的所有像素。 .Ping方法應該只用於如果你想從圖像中獲取信息而不加載整個圖像。

沒有辦法只替換/編輯一個值。您正在更換配置文件。您不需要true,因爲這是AddProfile的默認值。

可能有另一個庫可以幫助你做到這一點。您也可以閱讀JPEG規格並在文件中找到EXIF配置文件的位置。然後使用ExifProfile類對其進行修改並將其寫回圖像。我將把這部分作爲讀者的練習。

這個特性最終不會在ImageMagick中出現,因爲那意味着我們不得不重寫我們編碼和解碼圖像的方式。作爲Magick.NET的維護者,我可以在將來添加這個額外的功能。我已經編寫了ImageOptimizers,可用於縮小不是ImageMagick一部分的JPG/PNG圖像的大小。但我無法告訴你什麼時候可以使用。

+0

我懷疑像這樣,但謝謝你確認信息。在得到info JPEG規範後,我總結說,使用特定的,支持良好的工具而不是手動干預jpeg可能會帶來意想不到的後果:)最後一個問題:如果技術上可行 - 有一天我們會看到的機會是多少在Magick.NET中的'exif edit without content loading'功能? – Sam

+0

我已更新答案來回答此問題。 – dlemstra

+0

嗯,這個功能似乎並不像我想的那麼簡單,所以我們會找到其他一些方法來提高exif編輯一段時間。但我們很高興在將來看到這個功能:)無論如何,謝謝你的答案和Magick.NET! – Sam

相關問題