При настройке Image.Source для корректных данных изображение не отображается - PullRequest
0 голосов
/ 16 марта 2012

Я получаю byte[] данные изображения (из источника веб-камеры, переданные по сети) и хочу отобразить их в моем WPF Image control.Если я установлю разрешение на 160x120, я вижу хорошее крошечное изображение.Для любого другого разрешения, хотя я вижу nada, none, zilch, squat.

Если я записываю необработанные байты на диск, я вижу, что данные действительно являются допустимыми 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 ]

2 голосов
/ 16 марта 2012

Предполагая, что ImageRemoteVideo является экземпляром элемента управления WPF Image, вы можете столкнуться с некоторыми проблемами с отложенным разрешением.Элемент управления Image имеет методы BeginInit и EndInit, которые вы, вероятно, должны использовать.Поместите метод BeginInit до того, как вы установите поток, другой после того, как вы установите его.Также, если я правильно помню, класс Image поддерживает StreamSource.Вы можете попытаться установить MemoryStream (без его удаления и без использования JpegBitmapDecoder) для этого свойства.Если это работает, то посмотрите, сможете ли вы утилизировать его после вызова EndInit.

0 голосов
/ 16 марта 2012

Нашел это.Это как Брэннон сказал случай задержки загрузки.Указание «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();
                    }
0 голосов
/ 16 марта 2012

Я только что нашел способ заставить это работать, но я был бы рад, если бы кто-то мог объяснить ПОЧЕМУ это работает :) Во-первых, я использую необработанный поток данных для создания BitmapImage. НО - если я использую предложение "using" вокруг 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...