Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#绘制到窗口的速度比绘制图形快_C#_Wpf_Image_Video - Fatal编程技术网

C#绘制到窗口的速度比绘制图形快

C#绘制到窗口的速度比绘制图形快,c#,wpf,image,video,C#,Wpf,Image,Video,我有一个WPF窗口,上面有一个图像。我想快速更改图像,就像我在播放视频一样。假设所有数据都在内存中,有没有比下面更快的方法在窗口上绘制: public void updateCanvas(byte[] imageData, RECT bounds) { TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); Bitmap bitmap = (Bitmap)tc.ConvertFrom(

我有一个WPF窗口,上面有一个图像。我想快速更改图像,就像我在播放视频一样。假设所有数据都在内存中,有没有比下面更快的方法在窗口上绘制:

public void updateCanvas(byte[] imageData, RECT bounds)
    {
        TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
        Bitmap bitmap = (Bitmap)tc.ConvertFrom(imageData);

        Graphics g = Graphics.FromImage(canvas);
        g.DrawImageUnscaled(bitmap, bounds.left, bounds.top);
        this.Image.Source = Imaging.CreateBitmapSourceFromHBitmap(canvas.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        this.Image.InvalidateVisual();
    }
比如,有没有一种方法可以存储一个指向渲染字节数据的指针并进行字节复制?还是一种在窗口上快速绘制的方法(比如DirectX)

数据是生成的,所以我不能只播放视频文件


谢谢

最好不要为每一帧重新创建位图,而是重用一个实例。因此,如果您可以更改生成图像的代码,那么这样做是一个好主意。然而,更好的办法是实际测量性能并检查其是否足够好。如果是,就不用麻烦了。您将遇到的第一个问题是,您不能将一个位图替换为另一个位图来获得性能,就像它是一个视频(或任何相近的视频)一样。视频使用非常复杂的算法进行编码,以便只存储其中存在差异的帧,这样只会更新帧中正在更改的部分。它们在使用之前被压缩,因为通常不能实时完成。你最好能做的是像动画gif一样的东西,这是一种美化的幻灯片放映。如果你想用未压缩的位图制作动画,可以考虑使用双缓冲。但它在帧速率方面不会有太大帮助。使用directx过滤器,您可以从位图创建视频,但不会动态生成视频。如果要在屏幕上生成实时动画,可能需要查看opengl或directx,但不要使用位图。请将以上内容作为一篇文章阅读。我不确定它是否会更快,但我已经使用了
WriteableBitmap
用于类似的目的。它有一个
BackBuffer
,您可以访问它的
Handle
,这意味着您可以向它传输字节。这种方法不会带您到任何地方。如果你需要一个视频,为什么不放一个视频呢?我不明白。否则,如果您需要动画,WPF已经内置了对它们的支持,而且WPF矢量图形比位图的东西要好得多,而且可伸缩性也更好。基于上述所有原因,我强烈建议您重新考虑您的方法。