反复设置图像.源从二进制数据
本文关键字:二进制 数据 图像 设置 | 更新日期: 2023-09-27 18:06:57
我使用以下代码将图像设置为字节数据。然而,在第一次调用之后,图像不再响应数据而改变。
public async void SetImageFromByteArray(byte[] data)
{
using (InMemoryRandomAccessStream raStream =
new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(raStream))
{
// Write the bytes to the stream
writer.WriteBytes(data);
// Store the bytes to the MemoryStream
await writer.StoreAsync();
// Not necessary, but do it anyway
await writer.FlushAsync();
// Detach from the Memory stream so we don't close it
writer.DetachStream();
}
raStream.Seek(0);
BitmapImage bitMapImage = new BitmapImage();
bitMapImage.SetSource(raStream);
GameScreen.Source = bitMapImage;
await raStream.FlushAsync();
}
}
另外,我想能够运行这个函数每"x"毫秒,但我还没能找到一种方法来做到这一点
如果没有看到剩下的代码,就不可能确定,但是如果这个函数被反复调用,那么你可能不会从UI线程进行后续调用,这会在创建/访问BitmapImage和UI Image源时导致异常。这些调用必须从UI线程调用。像这样将最后几行代码封装在Dispatch调用中:
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
BitmapImage bitMapImage = new BitmapImage();
bitMapImage.SetSource(raStream);
GameScreen.Source = bitMapImage;
await raStream.FlushAsync();
});
这将确保这些调用在UI线程上运行。
对于你的问题的计时器部分,有几个选项。我不太喜欢使用计时器,所以我可能会创建一个线程,在调用之间使用一个简单的循环休眠:
Task.Run((async () =>
{
while(!stop)
{
byte [] data = GetNextImageBytes();
await SetImageFromByteArray(data);
await Task.Delay(2000);
}
});