繁体   English   中英

快速缩放/裁剪位图图像流以在WPF中显示

[英]Quickly scale/crop a bitmap image stream for display in WPF

题:

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

要求:

  1. CPU使用率低
  2. 处理大图像(5兆像素,约2500x2000像素)
  3. 调整大小和/或裁剪为与显示位图的UI元素相同的分辨率/区域。
  4. 使用WPF

具体来说,它必须允许14FPS 5百万像素摄像机图像流全速显示在WPF 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个左右),它的性能如何。

我认为可能会减慢绘图速度的另一件事是图像采用单色,Gray8格式,而不是标准RGB32(或者WPF是bgra32?)格式。 如果我理解正确,则必须将图像转换为要显示的标准格式,这会增加每帧绘制时间的开销。

一些背景:

我目前正在使用5百万像素,14 FPS的摄像机,正在尝试将帧全速渲染到屏幕上。 我想使用WPF做到这一点。

我目前在WinForms中有一个示例,该示例可以全速运行未缩放的图像,但是(正如我所期望的)如果设置pictureBox.SizeMode = Zoom;则存在很大的麻烦pictureBox.SizeMode = Zoom; 该示例将原始数据直接从相机流读取到缓冲区,然后将数据从缓冲区复制到设置为PictureBox控件的位图中。 复制算法使用LockBits加快速度。

我将该示例转换为WPF,使用Bitmap对象重写了零件,而改用WritableBitmap对象和Image控件而不是PictureBox 不幸的是,这无法将流以任何适当的比例(已缩放或未缩放)呈现到屏幕上。 两者都有大量的CPU负载和非常慢的更新。

关闭渲染到屏幕时的性能很好。 它能够以大约3%的CPU和少于100MB的内存来全速和高分辨率地处理图像流。

注意:当我说关闭向屏幕的渲染时,WritableBitmap仍在不断更新,只是未将其设置为Image控件。

我已经看到了很多有关在WPF中快速更新位图的讨论,但是未能使其以合理的速度/ cpu负载工作。 另外,我希望以可以看到整个图像的方式缩放图像。

我想关键在于需要进行某种缩放/裁剪组合,以便WPF不会尝试渲染(缓存?)所有500万像素,而是仅渲染屏幕上的像素,并且仅以当前屏幕分辨率渲染。 。 我想/希望可以很容易地做到这一点,并且不会对内存或CPU造成太大的影响,但是目前还不知道该怎么做。 我已经找到DecodePixelWidthDecodePixelHeight属性,但是这些属性仅在将图像从文件加载到BitmapImage

您是否看过以下帖子?

调整WritableBitmap的大小

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

您的图像分辨率是多少? UI元素的大小是否恒定? 它的大小是多少?


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

我敢肯定,将您的8位/像素乘以每个像素所需的位数乘以4而又不获得任何质量,将会减慢您的应用程序的速度。 尤其是因为您可以对每像素图像8位运行这些操作,所以您可以对每像素图像8位运行这些操作。

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

编辑:StackOverflow上具有约2300问题标记imagemagick 位置 例如,请参见ImageMagick convert中的样本/重采样/缩放/调整大小/自适应调整大小/缩略图运算符有何区别?

https://apple.stackexchange.com/a/41531的OP决定使用ImageMagick。 对于PHP中的高效JPEG图像大小调整,公认的答案还建议ImageMagick,获得19票。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM