首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >必须在与DependencyObject相同的线程上创建DependencyObject,即使使用Dispatcher WPF

必须在与DependencyObject相同的线程上创建DependencyObject,即使使用Dispatcher WPF
EN

Stack Overflow用户
提问于 2020-06-04 15:59:23
回答 1查看 214关注 0票数 0

我正在编写一个C# WPF应用程序,我正在使用AForge库进行视频流。我想部署应用程序,因为一切都在第一台pc上工作。

在另一台pc上,我得到了以下错误:

“即使使用Dispatcher,也必须在与DependencyObject相同的线程上创建DependencyObject”

这是源代码,我在从WebCam获得的每一个新帧上都调用它

代码语言:javascript
复制
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)

{ if (StreamRunning) { try {使用(var位图= ( bitmap )eventArgs.Frame.Clone()) {

代码语言:javascript
复制
                    Image = ToBitmapImage(bitmap);
                }
                Image.Freeze();
            }
            catch (Exception e)
            {
                UIMessages = "Error: NewFrame " + e.Message;
            }
        }

}

ToBitmapImage方法:

代码语言:javascript
复制
        private BitmapImage ToBitmapImage(Bitmap bitmap)
    {

        var start = 420;
        var end = 1920 - 2* 420;
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        MemoryStream ms = new MemoryStream();
        Bitmap source = bitmap;
        Bitmap CroppedImage = source.Clone(new System.Drawing.Rectangle(start, 0, end, 1080), source.PixelFormat);          
        CroppedImage.Save(ms, ImageFormat.Bmp);

        ms.Seek(0, SeekOrigin.Begin);
        bi.StreamSource = ms;
        bi.EndInit();
        return bi;
    }

进一步代码:

代码语言:javascript
复制
 private BitmapImage _image;
 public BitmapImage Image {
        get => _image;
        set
        {
            _image = value;
            OnPropertyChanged();
        }
    }

摄像机的开始:

代码语言:javascript
复制
            if (SelectedDevice != null)
            {
                _videoSource = new VideoCaptureDevice(SelectedDevice.MonikerString);
                //var test = _videoSource.VideoCapabilities;
                _videoSource.NewFrame += video_NewFrame;
                _videoSource.Start();


            }

UI:

代码语言:javascript
复制
 <Image Height="400" Width="400" Source="{Binding Image, UpdateSourceTrigger=PropertyChanged}" Margin="0,0,0,0"/>

我也试过这个:

代码语言:javascript
复制
 Dispatcher.CurrentDispatcher.Invoke(() => Image = ToBitmapImage(bitmap));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 08:42:06

当从流加载BitmapImage时,通常会尽快关闭流,并通过设置BitmapCacheOption.OnLoad来确保立即加载BitmapImage。

代码语言:javascript
复制
private static BitmapImage ToBitmapImage(Bitmap bitmap)
{
    var start = 420;
    var end = 1920 - 2 * 420;

    var croppedBitmap = bitmap.Clone(
        new System.Drawing.Rectangle(start, 0, end, 1080),
        bitmap.PixelFormat);          

    var bi = new BitmapImage();

    using (var ms = new MemoryStream())
    {
        croppedBitmap.Save(ms, ImageFormat.Bmp);
        ms.Seek(0, SeekOrigin.Begin);

        bi.BeginInit();
        bi.CacheOption = BitmapCacheOption.OnLoad;
        bi.StreamSource = ms;
        bi.EndInit();
    }

    bi.Freeze();

    return bi;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62199066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档