C# 快速缩放/裁剪位图图像流以在WPF中显示 问题:
缩放和/或裁剪从C# 快速缩放/裁剪位图图像流以在WPF中显示 问题:,c#,.net,wpf,windows,video-capture,C#,.net,Wpf,Windows,Video Capture,缩放和/或裁剪从WritableBitmap提供的位图以在UI中显示的快速方法是什么 要求: CPU使用率低 处理大型图像(500万像素,约2500x2000像素) 调整和/或裁剪到与显示位图的UI元素相同的分辨率/区域 使用WPF 具体而言,它必须允许以全速在WPF UI元素中显示每秒14帧、500万像素的摄像头图像流 更新: 通过使用ImageBrush在Canvas控件上绘制,我可以大大加快绘制速度,如下所示,m_bitmap是我的WriteableBitmap: ImageBrush b
WritableBitmap
提供的位图以在UI中显示的快速方法是什么
要求:
ImageBrush
在Canvas
控件上绘制,我可以大大加快绘制速度,如下所示,m_bitmap
是我的WriteableBitmap
:
ImageBrush brush = new ImageBrush();
brush.ImageSource = m_bitmap;
brush.Stretch = Stretch.Uniform;
canvas.Background = brush;
我现在能够获得完整的14FPS,尽管它仍然使用大约20%的CPU,所以我不确定如果我再添加一两个摄像头,它的性能会如何(计划是运行4个左右)
另一件我认为可能会减慢绘图速度的事情是,图像是单声道、灰度8格式,而不是标准RGB32(或者是WPF的bgra32?)格式。如果我理解正确,则必须将图像转换为要显示的标准格式,这将为每个帧的绘图时间增加大量开销
一些背景:
我目前正在使用一台500万像素、每秒14帧的摄像机,并试图以全速将帧渲染到屏幕上。我想用WPF做这个
我目前在WinForms中有一个例子,它可以全速运行未缩放的图像,但是(正如我所预料的)如果我设置pictureBox.SizeMode=Zoom代码>。该示例将原始数据直接从相机流读取到缓冲区,然后将数据从缓冲区复制到设置为PictureBox
控件的位图中。复制算法使用锁位来加快速度
我将该示例转换为WPF,使用Bitmap
对象重写部分,改为使用writeablebitmap
对象和Image
控件,而不是PictureBox
。不幸的是,这无法以任何合适的速率(缩放或未缩放)将流渲染到屏幕上。两者都有显著的CPU负载和非常缓慢的更新
关闭屏幕渲染时的性能非常好。它能够以全速和分辨率处理图像流,同时使用大约3%的CPU和少于100MB的内存
注意:当我说关闭屏幕渲染时,可写位图仍在不断更新,只是没有设置为图像控件
我已经看过很多关于在WPF中快速更新位图的讨论,但是都没有成功地让它以合理的速度/cpu负载工作。此外,我想有这样的方式,我可以看到整个图像缩放图像
我想关键在于某种需要进行的缩放/裁剪组合,以便WPF不会尝试渲染(缓存?)所有500万像素,而只渲染屏幕上的像素,并且仅以当前屏幕分辨率渲染。我想象/希望这可以相当容易地完成,并且不会对内存或CPU造成太大的影响,但目前还不知道如何做到这一点。我找到了DecodePixelWidth
和DecodePixelHeight
属性,但这些属性仅在将图像从文件加载到BitmaImage
时适用。您看过下面的帖子了吗
如果它不能解决您的问题,我还有更多问题要问您:
你的图像分辨率是多少?
UI元素的大小是否为常量?它有多大
编辑:
编辑后,我注意到您希望以灰度8像素格式显示位图图像,为什么不在创建位图图像(m_位图)时尝试设置此属性?
m_bitmap.Format=PixelFormat.Gray8;//无法测试
我确信,在不获得任何质量的情况下,采用8位/像素并将每个像素所需的位数乘以4,会降低应用程序的速度。尤其是当您可以在每像素8位的图像上运行操作时,您可以在每像素32位的图像上运行这些操作。虽然它的界面有点过时,但我相信,convert(请参阅)是非常常用的(事实上可能是行业标准)
编辑:StackOverflow有大约2300个问题,标记为imagemagick
。例如,见
的OP决定使用ImageMagick。被接受的答案也是ImageMagick,获得19票
但是,我不知道ImageMagick是否能够满足您的14FPS、500万像素的要求
唯一的答案是叉子,它似乎也适用于Windows。谢谢您提供的信息。。。不幸的是,链接信息并没有真正帮助我,但它确实让我朝着这个方向前进。查看更新以了解更多详细信息。@ScottLemmon我已经更新了我的答案,希望能有所帮助。基本上,如果你正在显示灰度图像,不需要将图像放大4倍,这会降低操作速度。这不是我想用灰度显示,而是我目前正在使用的。来自摄像机的原始数据是8位单声道流。我正在用PixelFormats.Gray8
Format属性将数据解码为WriteableBitmap
。我在更新中说的是,我记得听说WPF以32位颜色格式绘制所有内容,因此任何不以该格式绘制的位图都必须在绘制之前转换为该格式。如果真是这样的话,可能会让画画慢一点。我不明白你的意思。。。我是否使用链接软件转换图像流?我检查了它,虽然它有一个.NETAPI,但几乎没有文档。另外,我不需要将位图转换为其他格式,我需要