问题:
什么是缩放和/或裁剪从 a 提供的WritableBitmap
用于在 UI 中显示的位图的快速方法?
要求:
- CPU使用率低
- 处理大图像(5 兆像素,大约 2500x2000 像素)
- 调整大小和/或裁剪到与显示位图的 UI 元素相同的分辨率/区域。
- 使用 WPF
具体来说,它必须允许 14FPS 5 兆像素的相机图像流全速显示在 WPF UI 元素中。
更新:
我已经能够通过Canvas
使用ImageBrush
如下方式绘制到控件来加快绘图速度,m_bitmap
我的WriteableBitmap
:
ImageBrush brush = new ImageBrush();
brush.ImageSource = m_bitmap;
brush.Stretch = Stretch.Uniform;
canvas.Background = brush;
我现在能够获得完整的 14FPS,尽管它仍然使用大约 20% 的 CPU,所以我不确定如果我添加另一个或两个摄像头(计划是运行 4 个左右)它的性能如何。
我认为可能会减慢绘图速度的另一件事是图像采用单色 Gray8 格式,而不是标准的 RGB32(或者它是 WPF 的 bgra32?)格式。如果我理解正确,则必须将图像转换为要显示的标准格式,这会大大增加每一帧的绘制时间。
一些背景:
我目前正在使用 5 兆像素、14 FPS 的摄像机,并试图让帧全速渲染到屏幕上。我想使用 WPF 来做到这一点。
我目前在 WinForms 中有一个针对未缩放图像全速运行的示例,但是(正如我所料)如果我将pictureBox.SizeMode = Zoom;
. 该示例直接从相机流中读取原始数据到缓冲区,然后将数据从缓冲区复制到设置到PictureBox
控件的位图中。复制算法使用 LockBits 来加快速度。
我将该示例转换为 WPF,使用对象重写部分Bitmap
以使用WritableBitmap
对象和Image
控件而不是PictureBox
. 不幸的是,这无法以任何合适的速率(缩放或未缩放)将流渲染到屏幕上。两者都有显着的 CPU 负载和非常缓慢的更新。
关闭渲染到屏幕时的性能非常好。它能够以全速和分辨率处理图像流,同时使用大约 3% 的 CPU 和不到 100MB 的内存。
注意:当我说关闭屏幕渲染时,WritableBitmap 仍在不断更新,只是没有设置为 Image 控件。
我已经看到很多关于在 WPF 中获得快速位图更新的讨论,但未能使其以合理的速度/cpu 负载工作。另外,我希望以可以看到整个图像的方式缩放图像。
我想关键在于需要完成的某种缩放/裁剪组合,以便 WPF 不会尝试渲染(缓存?)所有 500 万像素,而只会渲染屏幕上的像素,并且仅以当前屏幕分辨率. 我想/希望这可以相当容易地完成,并且不会对内存或 CPU 造成太大影响,但目前不知道该怎么做。我找到了DecodePixelWidth
andDecodePixelHeight
属性,但这些仅适用于将图像从文件加载到BitmapImage
.