11

Exifを編集するためのさまざまなコードとライブラリを見つけました。

ただし、画像の幅と高さが 16 の倍数の場合にのみロスレスになります。

JPEG ファイルの Exif 部分だけを編集する (または Exif データがまだ存在しない場合は追加する) ライブラリ (または自分でそれを行う方法) を探しています。他のデータは変更されません。それは可能ではありませんか?

これまでのところ、Exif 部分 (0xFFE1 で始まる) しか見つけることができませんでしたが、データの読み取り方法がわかりません。

4

4 に答える 4

9

タグを編集するために独自のライブラリをコーディングする予定がある場合は、Exif 交換フォーマットの仕様を次に示します。

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

Perl で書かれた、あなたのニーズに合ったライブラリを次に示します。

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

The Code Projectからの Exif 評価用の適切な .NET ライブラリを次に示します。

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

于 2009-06-24T13:30:07.967 に答える
4

exiv2netライブラリ (exiv2 上の .NET ラッパー) が探しているものかもしれません。

于 2009-11-30T22:03:17.430 に答える
0

品質の低下を確認するために 1 つのファイルを何度も圧縮する小さなテストを書きました。

しかし幸いなことに、JpegBitmapEncoder で常に同じ QualityLevel を使用すると、劣化はありません。

この例では、メタデータでキーワードを 100x 書き換えましたが、品質は変わらないようです。

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($"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(".", $"_{i:000}.");

      using (Stream newFileStream = File.Open(copy, FileMode.Create, FileAccess.ReadWrite)) {
        encoder.Save(newFileStream);
      }
    }
  }
}
于 2016-02-11T21:37:34.477 に答える