我收到了一个带有 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;
}
}
我正在考虑更改我的生产代码,以便在提取元属性时始终使用 UTF8 解码器,即使 PropertyItem.Type 指示它是 ASCII。在这种情况下它当然有效,但我把它扔给你们,以防我遗漏了不可预见的后果。
那么 - 在提取 ASCII 元数据时使用 UTF8 解码器是不是一个坏主意?
PS:我还尝试使用以下代码使用 BitmapMetadata 类提取数据,但结果不正确。如果有一种可靠的方法来使用这种技术,我愿意接受。
// Returns incorrect string: "Test accents: éâäà è"
var value = bitmapMetadata.GetQuery("/app1/ifd/{ushort=270}") as string;