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;