1

EXIF ImageDescription メタデータの値が「アクセントのテスト: éâäàè」の画像ファイルを受け取りました。このデータを抽出するために .NET GDI+ クラスを使用すると、ASCII として格納されていると報告されますが、ASCII デコーダーを使用するとガベージ データが取得されます。試行錯誤の結果、UTF8 デコーダーを使用して正しく抽出できることを発見しました。

サンプルコードは次のとおりです。

public string GetDescription()
{
  const string filePath = @"C:\test_image.jpg";

  using (var bmp = new System.Drawing.Bitmap(filePath))
  {
    var propItem = bmp.PropertyItems.FirstOrDefault(p => p.Id == 270); // EXIF ImageDescription

    if (propItem == null)
      return null;

    string value = null;

    if (propItem.Type == 2) // ASCII
    {
      // Does not work: Returns "Test accents: ??????????"
      var asciiEnc = new System.Text.ASCIIEncoding();
      value = asciiEnc.GetString(propItem.Value, 0, propItem.Value.Length - 1);

      // CORRECT: Returns "Test accents: éâäàè"
      var utf8Enc = new System.Text.UTF8Encoding();
      value = utf8Enc.GetString(propItem.Value, 0, propItem.Value.Length - 1);
    }

    return value;
  }
}

PropertyItem.Type が ASCII であることを示していても、メタ プロパティを抽出するときに常に UTF8 デコーダーを使用するように、製品コードを変更することを検討しています。この場合は確かに機能しますが、私が見逃している予期しない結果が発生した場合に備えて、これをあなたに投げかけています.

では、ASCII メタデータを抽出するときに UTF8 デコーダーを使用するのは悪い考えですか?

PS: また、次のコードを使用して BitmapMetadata クラスでデータを抽出しようとしましたが、間違った結果が得られました。代わりにこの手法を使用する信頼できる方法があれば、私はそれを受け入れます。

// Returns incorrect string: "Test accents: éâäà è"
var value = bitmapMetadata.GetQuery("/app1/ifd/{ushort=270}") as string;
4

2 に答える 2

7

信頼を得ることはできません。Exif は一般的なエンコーディングの問題に悩まされています。Exif 標準では、7 ビットの ASCII コードのみを使用する必要があると規定されていますが、誰もがそれを無視しています。ASCII は多くの言語でテキストを適切にエンコードできません。ところで、Exif は、ASCII の使用がほとんどなく、エンコードの問題の豊富な歴史を持つ言語を持つ国である日本から来ています。そのため、UTF8 や ANSI など、イメージが作成された場所で一般的に使用されているコード ページが何であれ、各自に適したエンコーディングを選択するだけです。

岩と難しい場所の間で、UTF8Encoding を使用することが最良の選択です。ANSI コード ページでエンコードされたテキストはうまく処理できません。それについてできることはあまりありません。Encoding.Default は、2 番目の選択肢としては適切ではありません。画像内のテキストは、実際には utf-8 でエンコードされています。

しかし、はい、テキストが実際に純粋な ASCII である場合、UTF8Encoding は正常に機能します。Utf-8 は ASCII コードを同じ方法でエンコードします。

于 2013-10-09T23:25:42.133 に答える
0

IPTC 標準では、(Python にある) jboutで行うIptc.Envelope.CharacterSetようになっています。

self._md["Iptc.Envelope.CharacterSet"] = ['\x1b%G', ]

そしてもちろん、ディスク (または有線) に送られるものだけに UTF8 を使用するべきだと私は信じています。ANSI エンコーディング (または Microsoft の他のオペレーティング システムで呼び出されます) を使用することは、犯罪として罰せられるべきです。

于 2013-10-11T10:42:51.193 に答える