Я пытаюсь показать один кадр загруженного изображения GIF (из файла) внутри элемента управления изображения. У меня нет проблем с отображением (полного) изображения gif внутри элемента управления изображением, но я не могу отобразить кадр. В целях тестирования я всегда стараюсь загрузить кадр '0' (первый кадр).
XAML:
<Image>
<Image.Source>
<BitmapImage x:Name="GifFrame" AutoPlay="False" />
</Image.Source>
</Image>
На самом деле я не нахожу много информации в Интернете о том, как это сделать, но здесь и здесь есть некоторые фрагменты кода, некоторые, к сожалению, могут быть получены из WPF, и я не уверен на 100%, могут ли они использоваться также для UWP.
Когда изображение открывается, вызывается следующий метод " _OnImageOpened " ( _gifStream - это открытое изображение GIF, поток не был закрыт):
private IRandomAccessStream _gifStream = null;
private async void GifImage_OnImageOpened(object sender, RoutedEventArgs e)
{
// ...
uint frameCount = 0;
if (_gifStream != null)
{
var decoder = await BitmapDecoder.CreateAsync(_gifStream);
frameCount = decoder.FrameCount;
var frame = await decoder.GetFrameAsync(0);
// Create frame image
var pixelData = await frame.GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
new BitmapTransform(),
ExifOrientationMode.IgnoreExifOrientation,
ColorManagementMode.DoNotColorManage
).AsTask().ConfigureAwait(false);
var frameBytes = pixelData.DetachPixelData();
var memoryStream = new MemoryStream(frameBytes);
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
GifFrame.SetSource(memoryStream.AsRandomAccessStream());
});
}
}
Когда я устанавливаю новый источник ( GifFrame.SetSource (...) ), окно останавливается и ничего не происходит, я должен убить процесс. Прежде чем я добавил Dispatcher.RunAsync (...) вокруг настройки нового источника, я получил исключение " Приложение называло интерфейс, который был назначен для другого потока ... ».
Я понятия не имею, что вызывает это. Может быть, мне нужно преобразовать байты во что-то, что может понять элемент управления изображением, или, может быть, создание целых пиксельных данных неверно?