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

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

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

有任何想法吗? 谢谢

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

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

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

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

希望有所帮助。 你计划什么样的图像渲染?

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

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

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

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

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

更新:我只是重新阅读了你的问题,我意识到你可能不会通过使它们成为multithreading而在这些操作的整体速度上看到很多(如果有的话)。 这是一个九个女人经典的经典问题。