У меня есть следующий фрагмент кода, который печатает метаданные изображения с помощью API формирования изображений WPF:
void Main()
{
Uri imageUri = new Uri(@"E:\tmp\bomb.gif");
var decoder = BitmapDecoder.Create(imageUri, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
var f = decoder.Frames[0];
var m = f.Metadata as BitmapMetadata;
DumpMetadata(m);
}
void DumpMetadata(BitmapMetadata metadata)
{
DumpMetadata(metadata, 0);
}
void DumpMetadata(BitmapMetadata metadata, int indentLevel)
{
if (metadata == null)
{
Console.WriteLine ("(No metadata)");
return;
}
string indent = new string('\t', indentLevel);
foreach (var propertyName in metadata)
{
object value = metadata.GetQuery(propertyName);
BitmapMetadata complexProperty = value as BitmapMetadata;
if (complexProperty != null)
{
Console.WriteLine("{0}{1} =", indent, propertyName);
DumpMetadata(complexProperty, indentLevel + 1);
}
else
{
Type type = null;
if (value != null)
type = value.GetType();
Console.WriteLine("{0}{1} = {2} ({3})", indent, propertyName, value, type);
}
}
}
В Windows 7 он дает правильные результаты:
/imgdesc =
/Left = 0 (System.UInt16)
/Top = 0 (System.UInt16)
/Width = 78 (System.UInt16)
/Height = 121 (System.UInt16)
/LocalColorTableFlag = False (System.Boolean)
/InterlaceFlag = False (System.Boolean)
/SortFlag = False (System.Boolean)
/LocalColorTableSize = 7 (System.Byte)
/grctlext =
/Disposal = 2 (System.Byte)
/UserInputFlag = False (System.Boolean)
/TransparencyFlag = True (System.Boolean)
/Delay = 10 (System.UInt16)
/TransparentColorIndex = 0 (System.Byte)
Но в Windows XP (SP3) свойство Metadata
всегда равно нулю для изображений GIF (анимированных или нет).
Я думаю, что проблема может быть связана с Windows Imaging Component, но WIC должен быть установлен с SP3 (а также как часть .NET 3.0; у меня 3.5 SP1 и 4.0 на этом ПК), поэтому он должен работать на ХР тоже.
Не уверен, что здесь происходит ... Это просто отсутствующий кодек? Есть ли способ заставить этот код работать на XP?
РЕДАКТИРОВАТЬ: мне нужна информация о Delay
поле (длительность кадра); если я не могу получить BitmapMetadata
, есть ли другой способ извлечь эту информацию? В идеале я бы предпочел использовать только API для создания образов WPF (т.е. не GDI / System.Drawing).
ОБНОВЛЕНИЕ: я разместил тот же вопрос на форумах MSDN , и, согласно полученному ответу, метаданные GIF поддерживаются только в Windows 7 и в Vista с обновлением платформы ( см. Здесь и там ). Так что я думаю, что просто невозможно заставить его работать на XP с использованием API-образа WPF. Я, вероятно, в конечном итоге использовать System.Drawing, но я открыт для лучших предложений ...