0

画像データを (ネットワーク経由で送信された Web カメラ ソースから)受信byte[]しており、それを WPF 画像コントロールに表示したいと考えています。解像度を 160x120 に設定すると、小さくてきれいな画像が表示されます。その他の解像度については、nada、nothing、zilch、squat が表示されます。

生のバイトをディスクに書き込むと、データが実際に有効な 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 コントロールには、おそらく使用する必要がある "BeginInit" および "EndInit" メソッドがあります。ストリームを設定する前に BeginInit メソッドを配置し、設定後にもう 1 つのメソッドを配置します。また、私の記憶が正しければ、Image クラスは StreamSource をサポートしています。そのプロパティに(破棄せず、JpegBitmapDecoder を使用せずに)MemoryStream を設定してみてください。それが機能する場合は、EndInit 呼び出しの後に破棄できるかどうかを確認してください。

于 2012-03-15T20:52:31.637 に答える
0

Found it. It's like Brannon said a case of delayed loading. Specifying "CacheOption = BitmapCacheOption.OnLoad;" fixes it !

Cheers !

Working version :

                    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」句を使用しても機能しません。

したがって、これは機能しません:

                    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 に答える