2

我有一个带有Image控件的 WPF 应用程序。我正在使用WriteableBitmapto update Image.source,但我不明白为什么我会看到这种奇怪的行为:我的图像分成两部分,顶部以相当慢的速度缓慢移动到循环底部。在此处输入图像描述 我不明白为什么会这样。顶部和底部实际上是同一个框架,因为我可以看到它们的实时更新。

我的代码:

    public MainWindow()
    {
        InitializeComponent();
        InitVideo();
        image.Source = frame;
    }

    private void InitVideo
    {
        /// .... some other init stuff ... 
        frame = new WriteableBitmap(width, height, 96, 96, PixelFormats.Rgb24, null);
        rgbch = new byte[stride * height];
        dataProc = new System.Threading.Thread(ReadData);
        dataProc.Start();
    }

    // in separate thread
    private void ReadData()
    {
        while (rxVideo)
        {
            for (int i = 0; i < rgbch.Length; i += stride)
            {
                pipe.Read(rgbch, i, stride);
            }

            Application.Current.Dispatcher.Invoke(() =>
           {
               frame.Lock();
               frame.WritePixels(new Int32Rect(0, 0, width, height), rgbch, stride, 0);
               frame.Unlock();
           });
     }

我尝试使用frame.dispatcher.invoke-> 相同的结果。尝试Marshal.Copy->相同的结果..

4

2 回答 2

1

我找到了问题的根源。

这是由我在线程内的代码引起的

        for (int i = 0; i < rgbch.Length; i += stride)
        {
            pipe.Read(rgbch, i, stride);
        }

rgbch被设置为 writablebitmap backbuffer 的源,所以当我在其中写入新数据时,更新工作缓慢,所以我得到了那个奇怪的上下更新。我只是这样做了pipe.read(rgbch, 0, rgbch.Length),而且一切都运行得更快,图像中没有任何边界。

于 2016-09-01T10:17:19.987 回答
0

它几乎与您的代码无关。这可能是因为:

  • 非常大的图像大小(可能是 100 MB)
  • 网络低带宽
  • 显卡弱

您应该寻找几年前逐行显示图像的原因。那些年互联网带宽非常低,这是一种让用户在完全加载之前看到图像的技术。我知道你知道这一点。我只是写它以使答案完整!

于 2016-08-31T15:22:03.527 回答