C# 为什么我的图像会从上到下逐行更新

C# 为什么我的图像会从上到下逐行更新,c#,wpf,image,writablebitmap,C#,Wpf,Image,Writablebitmap,我有一个WPF应用程序,里面有Image控件。 我正在使用WriteableBitmap更新图像。source,但我不明白为什么我会看到这种奇怪的行为:我的图像分成两部分,顶部以相当慢的速度缓慢地向底部移动。 我不明白为什么会这样。顶部和底部实际上是同一个框架,因为我可以看到它们中的实时更新 我的代码: public MainWindow() { InitializeComponent(); InitVideo(); image.S

我有一个WPF应用程序,里面有
Image
控件。 我正在使用
WriteableBitmap
更新
图像。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();
           });
     }
public主窗口()
{
初始化组件();
InitVideo();
image.Source=frame;
}
私人视频
{
///..其他一些初始化的东西。。。
frame=新的WriteableBitmap(宽度、高度、96、96、PixelFormats.Rgb24、空);
rgbch=新字节[步幅*高度];
dataProc=新的System.Threading.Thread(读取数据);
dataProc.Start();
}
//分头
私有void ReadData()
{
while(rxVideo)
{
对于(int i=0;i
{
frame.Lock();
frame.WritePixels(新的Int32Rect(0,0,宽度,高度),rgbch,步长,0);
frame.Unlock();
});
}
我尝试使用
frame.dispatcher.invoke
->得到相同的结果。
尝试了
封送处理。复制
->相同的结果。

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

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

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

我发现了一个问题的根源

这是因为我的代码在线程中

        for (int i = 0; i < rgbch.Length; i += stride)
        {
            pipe.Read(rgbch, i, stride);
        }
for(int i=0;i
rgbch
被设置为writablebitmap backbuffer的源代码,所以当我在其中写入新数据时,更新速度很慢,所以我得到了奇怪的上下更新。
我刚刚做了
pipe.read(rgbch,0,rgbch.Length)
并且它在图像中没有任何边框的情况下运行得更快。

“缓慢移动”可能表示布局有问题(当家长将自己自动调整为不断增长的孩子时).什么是
stride
设置为?它的宽度是*3,因为我的图像格式是24rgbWell,所以我重写了代码以显示小图像(640x480)。结果是一样的。因为它看起来像我的两个“帧”(顶部和底部)都是一样的,不像以前新的慢慢覆盖旧的。我想我的问题是因为线程中的错误代码,更新了框架。但是我不知道该怎么做来纠正它。