将Image.Source设置为有效数据时不显示图像

时间:2012-03-15 20:02:27

标签: wpf image imagesource

我正在接收byte[]图像数据(来自网络摄像头,通过网络传输),并希望在我的WPF图像控件中显示它。 如果我将分辨率设置为160x120,我会看到一个很好的小图像显示。 对于任何其他决议,虽然我看到了虚无,没有,zilch,深蹲。

如果我将原始字节写入磁盘,我可以看到数据确实是一个有效的jpg图像。 为了确保它不是jpeg不兼容,我用png和bmp编码/解码测试了它,结果相同;仍然没有形象。

任何人都有一个好主意?

    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];
                }
            }
        );
    }

3 个答案:

答案 0 :(得分:2)

假设ImageRemoteVideo是WPF图像控件的一个实例,您可能会遇到一些懒惰的解决问题。 Image控件具有您应该使用的“BeginInit”和“EndInit”方法。在设置流之前放置BeginInit方法,在设置之后放置另一个方法。另外,如果我没记错,Image类支持StreamSource。您可以尝试将MemoryStream(不需要处理它而不使用JpegBitmapDecoder)设置为该Property。如果可以,那么看看你是否可以在EndInit调用之后处理它。

答案 1 :(得分:0)

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

所以这不起作用:

                    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;

答案 2 :(得分: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();
                    }