反复设置图像.源从二进制数据

本文关键字:二进制 数据 图像 设置 | 更新日期: 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);
                }
            });