gpt4 book ai didi

c# - 是否可以从另一个线程修改内存 'unsafe' ly 中的 WPF BitmapSource

转载 作者:行者123 更新时间:2023-11-30 22:43:30 25 4
gpt4 key购买 nike

我想在 WPF 应用程序中对图像进行一些处理。但是,我想在运行时修改内存中 BitmapSource 的像素。

我目前正在设法使用“不安全”代码对付老式的 System.Drawing.Bitmap 来做到这一点,它完成了一项工作(锁定工作区域,摆弄像素)。这篇文章中描述了该方法:http://blogs.msdn.com/b/ericgu/archive/2007/06/20/lost-column-2-unsafe-image-processing.aspx

为了让它在 WPF 中工作,我然后使用这种方法创建了一个 WPF BitmapSource:

    BitmapSource destination;
IntPtr hBitmap = bitmap.GetHbitmap();
BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
destination = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions);
destination.Freeze();
return destination;

但是,这会在内存中创建大量副本,我真的很想进入那里并摆弄 BitmapSource 中的底层位,就像 EricGu 在位图示例中展示的那样。这可能吗?

我知道 PixelShaders 可能可以做到这一点,但这是一个涉及多线程的学术练习(在不安全模式下编辑位图时支持)。

提前致谢

最佳答案

我会尽我所能告诉你的。

首先,您似乎已经了解在将位图返回主线程之前卡住位图。这是一个好的开始。

我曾经尝试通过从 BitmapSource 派生新的实现来减少复制,并覆盖将数据复制出位图的虚函数。它工作但产生了大量的内存泄漏。从来没有想出来。

当然,您也可以直接从字节数组创建 BitmapSource(并减少 GDI 位图的开销)。 msdn docs

您是否考虑过 WriteableBitmap ?这是 WPF 团队对有关所有复制的普遍提示的回应。

编辑:MSDN 明确表示(在 WritableBitmap.BackBuffer 文档中)它可以在后台线程中使用:

You can pass the BackBuffer pointer to external components and other threads for processing, but if you do, you must provide you own thread coordination. In particular, you must ensure that the UI thread specifies changed areas by calling the AddDirtyRect method, and that the UI thread unlocks the buffer by calling the Unlock method.

因此,如果让 UI 线程获取锁和指针,就可以让工作线程写入像素。

关于c# - 是否可以从另一个线程修改内存 'unsafe' ly 中的 WPF BitmapSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3923697/

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