Image控件的BitmapSource加载WriteableBitmap速度慢

GaoAlex123456 2025-08-13 15:43:45

WriteableBitmap是相机采集的IntPtr来转换的

internal WriteableBitmap CreateBitmap(WriteableBitmap bitmap, int width, int height, IntPtr ptr)
        {
            try
            {
                byte[] rgbData = new byte[width * height * 3];
                Marshal.Copy(ptr, rgbData, 0, rgbData.Length);
                if(bitmap == null ) return null;
                bitmap.Lock(); 
                bitmap.WritePixels(new Int32Rect(0, 0, width, height), rgbData, width * 3, 0);
                bitmap.AddDirtyRect(new Int32Rect(0, 0, width, height)); 
                bitmap.Unlock(); 
                return bitmap;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }

图片是双屏幕显示的

ShowImage.Source = MicroscopeCamera.Instance.writeableBitmap;
seconDivest.ShowImage.Source = MicroscopeCamera.Instance.writeableBitmap;

1080p的画面,这时帧率只有19帧每秒,如果去掉一个屏幕显示就能达到预期的30帧每秒

而且还发现一个问题就是使用VS Debug直接F5运行后双屏也能达到预期的30帧每秒,但是使用Ctrl + F5运行就不行,最多只能达到19帧。这是什么原因,如何解决

...全文
45 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在 WPF 中,WriteableBitmap 是一个关键类,允许开发者将位图作为可写像素数组进行操作,特别适用于高效处理图片和视频流。它通过直接操作像素值,避免频繁创建新的 BitmapSource 对象,从而降低 CPU 和内存开销。 在 WPF 中,可以通过指定宽度、高度、分辨率和像素格式来创建 WriteableBitmap 对象。例如: 其中,dpiX 和 dpiY 表示分辨率,PixelFormats.Bgra32 表示每个像素占用 4 个字节,包含透明度(Alpha)、蓝(Blue)、绿(Green)和红(Red)通道。 可以通过设置 Image 控件Source 属性,将其绑定到 WriteableBitmap 对象,如下所示: 当接收到新的视频帧时,可以使用 WriteableBitmap 的 Lock 和 Unlock 方法高效更新像素,避免不必要的内存复制。基本流程如下: 获取像素缓冲区 更新像素数据 根据视频帧数据修改 pixels 数组中的像素值。 应用更新 为了确保视频播放流畅,建议使用异步操作处理新帧,避免阻塞 UI 线程。可以使用 Task.Run 或 Dispatcher.BeginInvoke 在后台线程处理视频帧,然后在 UI 线程更新 WriteableBitmap。 在处理视频流时,注意及时释放不再使用的资源,如解码后的视频帧数据,以防止内存泄漏。 通过分析和运行示例代码,可以更好地理解 WriteableBitmap 在处理图片流视频中的应用,从而提升应用程序性能并掌握 WPF 图像处理的核心技术。
【源码免费下载链接】:https://renmaiwang.cn/s/gme2t 在Windows Presentation Foundation (WPF) 中,WriteableBitmap 是一个非常重要的类,它允许开发者将位图作为可写的像素数组来处理。这个类是用于直接操作图像像素,从而实现高效地处理图片和视频流。在本示例中,我们将探讨如何使用WriteableBitmap来处理图片流视频,并绑定到Image控件,以降低CPU负载并提高性能。我们需要理解WriteableBitmap的基本用法。WriteableBitmap提供了一个二维像素数组,通过WritePixels方法,我们可以直接修改这些像素的值。这使得我们可以高效地更新图像内容,尤其是在处理实时视频流时,可以避免频繁创建新的BitmapSource对象,从而减少内存和CPU的开销。1. **创建WriteableBitmap对象** 在WPF中,我们可以创建一个WriteableBitmap对象,指定宽度、高度以及像素格式。例如: ```csharp WriteableBitmap wb = new WriteableBitmap(width, height, dpiX, dpiY, PixelFormats.Bgra32, null); ``` 这里,dpiX和dpiY代表分辨率,PixelFormats.Bgra32表示每个像素4个字节,包含透明度(Alpha)、蓝色(Blue)、绿色(Green)和红色(Red)通道。2. **绑定到Image控件** 我们可以通过设置Image控件Source属性,将其数据源绑定到WriteableBitmap对象,如下所示: ```csharp Image imageControl = new Image(); imageControl.Source = wb

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧