0

我正在接收byte[]图像数据(来自网络摄像头源,通过网络传输)并希望在我的 WPF Image 控件中显示它。如果我将分辨率设置为 160x120,我会看到一个漂亮的小图像正在显示。对于任何其他解决方案,尽管我看到 nada,什么都没有,zilch,蹲下。

如果我将原始字节写入磁盘,我可以看到数据确实是有效的 jpg 图像。只是为了确保它不是 jpeg 不兼容,我已经用 png- 和 bmp-encoding/decoding 对其进行了测试,结果相同;仍然没有图像。

有人有一个好主意吗?

    private bool OnImage(byte[] inJpg)
    {
        this.Dispatch(() =>
            {
                //File.WriteAllBytes("h:\\tmp\\test" + sImageNum++ + ".jpg", inJpg);
                using (MemoryStream ms = new MemoryStream(inJpg))
                {
                    BitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.Default);
                    ImageRemoteVideo.Source = decoder.Frames[0];
                }
            }
        );
    }
4

3 回答 3

2

假设 ImageRemoteVideo 是 WPF Image 控件的一个实例,您可能会被一些惰性解决问题所困扰。Image 控件具有您可能应该使用的“BeginInit”和“EndInit”方法。在设置流之前放置 BeginInit 方法,在设置之后放置其他方法。另外,如果我没记错的话,Image 类支持 StreamSource。您可以尝试将 MemoryStream(不处理它并且不使用 JpegBitmapDecoder)设置为该属性。如果这可行,那么看看你是否可以在 EndInit 调用之后处理它。

于 2012-03-15T20:52:31.637 回答
0

找到了。这就像布兰农所说的延迟加载的案例。指定“CacheOption = BitmapCacheOption.OnLoad;” 修复它!

干杯!

工作版本:

                    MemoryStream byteStream = new MemoryStream(inJpg);
                    {
                        BitmapImage image = new BitmapImage();
                        image.BeginInit();
                        image.StreamSource = byteStream;
                        image.CacheOption = BitmapCacheOption.OnLoad;
                        image.EndInit();

                        ImageRemoteVideo.BeginInit();
                        ImageRemoteVideo.Source = image;
                        ImageRemoteVideo.EndInit();
                    }
于 2012-03-15T21:23:17.480 回答
0

我刚刚找到了一种让它工作的方法,但如果有人能解释它为什么工作,我会很高兴:) 首先,我使用原始字节流来创建一个 BitmapImage。但是 - 如果我在 MemoryStream 周围使用“使用”子句,它就不起作用,如果我不起作用。

所以这不起作用:

                    using (MemoryStream byteStream = new MemoryStream(inJpg))
                    {
                        BitmapImage image = new BitmapImage();
                        image.BeginInit();
                        image.StreamSource = byteStream;
                        image.EndInit();
                        ImageRemoteVideo.Source = image;
                    }

但这确实:

                    MemoryStream byteStream = new MemoryStream(inJpg);
                    BitmapImage image = new BitmapImage();
                    image.BeginInit();
                    image.StreamSource = byteStream;
                    image.EndInit();
                    ImageRemoteVideo.Source = image;
于 2012-03-15T21:13:49.700 回答