gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:48:23 24 4
gpt4 key购买 nike

问题:

缩放和/或裁剪从 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 控件的位图中。复制算法使用 LockBits 来加快速度。

我将该示例转换为 WPF,使用 Bitmap 对象重写部分以使用 WritableBitmap 对象和 Image 控件代替 图片框。不幸的是,这无法以任何合适的速率(缩放或未缩放)将流渲染到屏幕。两者都有显着的 CPU 负载和非常缓慢的更新。

关闭渲染到屏幕时的性能非常好。它能够以全速和全分辨率处理图像流,同时使用大约 3% 的 CPU 和不到 100MB 的内存。

注意:当我说渲染到屏幕关闭时,WritableBitmap 仍在不断更新,只是没有设置到 Image 控件。

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

我想关键在于需要完成某种缩放/裁剪组合,这样 WPF 就不会尝试渲染(缓存?)所有 500 万像素,而只渲染屏幕上的像素,并且只渲染当前屏幕分辨率。我想/希望这可以很容易地完成,并且不会对内存或 CPU 造成太大的影响,但目前不知道如何去做。我找到了 DecodePixelWidthDecodePixelHeight 属性,但这些属性仅在将图像从文件加载到 BitmapImage 时适用。

最佳答案

你看过下面的帖子了吗?

Resizing WritableBitmap

如果还不能解决你的问题,我还有问题要问你:

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


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

我敢肯定,采用 8 位/像素并将每个像素所需的位数乘以 4 而没有获得任何质量会减慢您的应用程序。特别是因为当您可以对每像素 8 位图像运行这些操作时,您对每像素 32 位图像运行这些操作。

关于c# - 快速缩放/裁剪位图图像流以在 WPF 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com