[英]Quickly scale/crop a bitmap image stream for display in WPF
缩放和/或裁剪WritableBitmap
提供的位图以显示在UI中的快速方法是什么?
具体来说,它必须允许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造成太大的影响,但是目前还不知道该怎么做。 我已经找到DecodePixelWidth
和DecodePixelHeight
属性,但是这些属性仅在将图像从文件加载到BitmapImage
。
您是否看过以下帖子?
如果它不能解决您的问题,那么我还有更多问题要问:
您的图像分辨率是多少? 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.