从多个线程渲染到单个Bitmap对象

时间:2009-03-16 01:41:27

标签: c# multithreading graphics bitmap rendering

我正在做的是将多个位图呈现给单个位图。可能有数百个图像,并且渲染的位图可能超过1000x1000像素。

我希望通过使用多个线程来加速这个过程,但由于Bitmap对象不是线程安全的,因此它不能直接同时呈现。我想的是将大位图分成每个cpu的部分,分别渲染它们然后在最后将它们连接在一起。我还没有这样做,但是你们/女孩们有更好的建议。

有什么想法吗?感谢

5 个答案:

答案 0 :(得分:4)

您可以使用LockBits并处理图像的各个部分。

有关如何完成此操作的示例,您可以查看Paint.Net源代码,尤其是BackgroundEffectsRenderer(是的,它是单声道分支的链接,但Paint.Net主代码似乎是仅适用于zip文件。)

答案 1 :(得分:1)

Lee,如果您要使用Image GDI +对象,您可能最终会完成所有工作两次。你在多个线程中生成的部分需要在你的分而治之的方法结束时重新组装,这不会破坏首先划分的目的吗?

如果你在每个位图部分做一些相当复杂的事情,这个问题可能只会被克服,这比处理时间要长得多,而不是简单地将图像子部分重新绘制到大位图而不会遇到任何麻烦。

希望有所帮助。你打算用什么样的图像渲染?

答案 2 :(得分:0)

您可以让每个线程写入一个字节数组,然后当它们全部完成时,使用单个线程从字节数组创建一个位图对象。如果所有其他处理都已经完成,那应该很快。

答案 3 :(得分:0)

我做了类似的事情,在我的情况下,我有每个线程锁定x(取决于图像的大小和线程数)图像中的多行位,并写入这些位,使得没有线程与他们的写作重叠。

答案 4 :(得分:0)

一种方法是将所有小位图渲染到 ersatz 位图上,这只是一个二维int数组(有点像Bitmap无论如何真的是这样)。将所有小位图组合在大数组中后,您可以将大数组中的一次性副本复制到相同维度的实际Bitmap

我一直在Windows Mobile设备上使用这种方法(不包括多线程方面)复杂图形,因为可用于创建“真正的”GDI +位图的内存受到严重限制。

您也可以按原样使用BitmapBitmap不保证是线程安全的,但我不确定这是一个问题,只要你能确保没有两个线程覆盖位图的相同部分。我试试看,至少。

更新:我刚刚重新阅读了您的问题,我意识到您可能不会看到这些操作的整体速度有多大提升(如果有的话)螺纹。这是一个经典的9个女人不能让孩子在一个月的问题。