2

问题:

什么是缩放和/或裁剪从 a 提供的WritableBitmap用于在 UI 中显示的位图的快速方法?

要求:

  1. CPU使用率低
  2. 处理大图像(5 兆像素,大约 2500x2000 像素)
  3. 调整大小和/或裁剪到与显示位图的 UI 元素相同的分辨率/区域。
  4. 使用 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 造成太大影响,但目前不知道该怎么做。我找到了DecodePixelWidthandDecodePixelHeight属性,但这些仅适用于将图像从文件加载到BitmapImage.

4

2 回答 2

0

你看过下面的帖子吗?

调整 WritableBitmap 的大小

如果它不能解决您的问题,我还有更多问题要问您:

你的图像分辨率是多少?你的 UI 元素的大小是不变的吗?它的大小是多少?


编辑:编辑后,我注意到您想以 Gray8 PixelFormat 显示 BitmapImage,为什么不尝试在创建 BitmapImage (m_bitmap) 时设置此属性?m_bitmap.Format = PixelFormat.Gray8; // 无法测试

我敢肯定,在没有获得任何质量的情况下,采用 8 位/像素并将每个像素所需的位数乘以 4 会减慢您的应用程序的速度。尤其是因为您可以在每像素 8 位的图像上运行这些操作,但您可以在每像素 32 位的图像上运行这些操作。

于 2013-01-23T03:42:36.230 回答
0

虽然它的界面有点过时,但我相信convert(参见http://en.wikipedia.org/wiki/ImageMagick)非常常用(实际上可能是行业标准)。

编辑: StackOverflow 有大约 2,300 个问题标记为imagemagick here。例如参见ImageMagick convert 中的 sample/resample/scale/resize/adaptive-resize/thumbnail 运算符有什么区别?

https://apple.stackexchange.com/a/41531的 OP决定使用 ImageMagick。在 PHP 中对 Efficient JPEG Image Resizing的公认答案也建议使用 ImageMagick,获得 19 票。

但是,我不知道 ImageMagick 是否能够满足您对14FPS, 5 Megapixels的要求。

对 Linux 上实时图像处理工具推荐的唯一答案是 fork graphicsmagick,它似乎也可用于 Windows。

于 2013-01-23T04:40:35.343 回答