Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 快速缩放/裁剪位图图像流以在WPF中显示 问题:_C#_.net_Wpf_Windows_Video Capture - Fatal编程技术网

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中显示的快速方法是什么

要求:
  • CPU使用率低
  • 处理大型图像(500万像素,约2500x2000像素)
  • 调整和/或裁剪到与显示位图的UI元素相同的分辨率/区域
  • 使用WPF
  • 具体而言,它必须允许以全速在WPF UI元素中显示每秒14帧、500万像素的摄像头图像流

    更新: 通过使用
    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,但几乎没有文档。另外,我不需要将位图转换为其他格式,我需要