Библиотека .NET C # для перезаписи Exif без потерь? [закрыто]

StackOverflow https://stackoverflow.com/questions/1038206

  •  10-07-2019
  •  | 
  •  

Вопрос

Я нашел различные коды и библиотеки для редактирования Exif .

Но они без потерь только тогда, когда ширина и высота изображения кратны 16.

Я ищу библиотеку (или даже способ сделать это сам) для редактирования только части Exif в файле JPEG (или добавления данных Exif, если они еще не существуют), оставляя другие данные без изменений. Разве это не возможно?

До сих пор я мог только найти часть Exif (начинается с 0xFFE1), но я не понимаю, как читать данные.

Это было полезно?

Решение

Вот спецификации для формата обмена Exif, если вы планируете кодировать свою собственную библиотеку для редактирования тегов.

http://www.exif.org/specifications.html

Вот библиотека, написанная на Perl, которая отвечает вашим потребностям, и вы можете поучиться у них:

http://www.sno.phy.queensu.ca/~phil / ExifTool /

Вот достойная библиотека .NET для оценки Exif из проекта кода :

http://www.codeproject.com/KB/graphics/exiftagcol.aspx

Другие советы

библиотека exiv2net (оболочка .NET поверх exiv2) может быть тем, чем вы ищем.

Я написал небольшой тест, в котором много раз сжимаю один файл, чтобы увидеть снижение качества, и вы можете увидеть его в третьем-четвертом сжатии, что очень плохо.

Но, к счастью, если вы всегда используете один и тот же QualityLevel с JpegBitmapEncoder, ухудшение не происходит.

В этом примере я перезаписываю ключевые слова 100 раз в метаданных, и качество, похоже, не меняется.

private void LosslessJpegTest() {
  var original = "d:\\!test\\TestInTest\\20150205_123011.jpg";
  var copy = original;
  const BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile;

  for (int i = 0; i < 100; i++) {
    using (Stream originalFileStream = File.Open(copy, FileMode.Open, FileAccess.Read)) {
      BitmapDecoder decoder = BitmapDecoder.Create(originalFileStream, createOptions, BitmapCacheOption.None);

      if (decoder.CodecInfo == null || !decoder.CodecInfo.FileExtensions.Contains("jpg") || decoder.Frames[0] == null)
        continue;

      BitmapMetadata metadata = decoder.Frames[0].Metadata == null
        ? new BitmapMetadata("jpg")
        : decoder.Frames[0].Metadata.Clone() as BitmapMetadata;

      if (metadata == null) continue;

      var keywords = metadata.Keywords == null ? new List<string>() : new List<string>(metadata.Keywords);
      keywords.Add(<*>quot;Keyword {i:000}");
      metadata.Keywords = new ReadOnlyCollection<string>(keywords);

      JpegBitmapEncoder encoder = new JpegBitmapEncoder {QualityLevel = 80};
      encoder.Frames.Add(BitmapFrame.Create(decoder.Frames[0], decoder.Frames[0].Thumbnail, metadata,
        decoder.Frames[0].ColorContexts));

      copy = original.Replace(".", <*>quot;_{i:000}.");

      using (Stream newFileStream = File.Open(copy, FileMode.Create, FileAccess.ReadWrite)) {
        encoder.Save(newFileStream);
      }
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top