2016-04-06 2 views
1

Я использую библиотеку для чтения значений exif Magick.NET. Для максимальной производительности я использую метод 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(); 

      ... 
     } 

Но все это содержанию изображения расшифровывает , мне не нужно это для изменения значений тегов «контент-независимого» например Copyright или ДатаTimeDigitized.

Вопрос заключается в том: как редактировать это теги EXIF ​​без загрузки всего содержания изображения?
И мне нужно переписать весь профиль exif (image.AddProfile(profile, true)) или есть какой-то способ просто отредактировать профиль?

ответ

2

К сожалению, в Magick.NET нет способа сделать это. Вы должны прочитать все пиксели изображения с помощью .Read, если хотите записать изображение. Метод .Ping должен использоваться только в том случае, если вы хотите получить информацию с изображения без загрузки всего изображения.

Невозможно заменить/отредактировать только одно значение. Вы правильно меняете профиль. Вам не нужен true, хотя это значение по умолчанию для AddProfile.

Возможно, существует другая библиотека, которая могла бы помочь вам в этом. Вы также можете прочитать спецификации JPEG и найти положение профиля EXIF ​​в своем файле. Затем используйте класс ExifProfile, чтобы изменить его и записать обратно в изображение. Я оставлю эту часть упражнением для читателя.

Также не очень вероятно, что эта функция закончится в ImageMagick, потому что это означало бы, что нам придется переписать способ кодирования и декодирования изображений. Будучи разработчиком Magick.NET, я мог бы добавить эту дополнительную функцию в будущем. Я уже писал ImageOptimizers, который можно использовать для уменьшения размера изображений JPG/PNG, которые не являются частью ImageMagick. Но я не могу сказать, когда это будет доступно.

+0

Я подозревал что-то вроде этого, но спасибо за подтверждение информации. После получения информации о спецификациях JPEG я пришел к выводу, что определенно лучше использовать конкретный, хорошо поддерживаемый инструмент, а не ручное вмешательство в jpeg с возможными неожиданными последствиями :) Последний вопрос: если это технически возможно - каковы шансы, что в один прекрасный день мы увидим как «exif редактировать без загрузки контента» в Magick.NET? – Sam

+0

Я обновил ответ, чтобы ответить на этот вопрос. – dlemstra

+0

Ну, эта функция кажется не так просто реализовать, как я думал, поэтому мы найдем другой способ ускорить редактирование exif. Но мы будем рады видеть эту функцию в будущем :) В любом случае, спасибо за ответы и за Magick.NET вообще! – Sam

Смежные вопросы