我正在做的是将多个位图渲染到单个位图。可能有数百个图像,并且被渲染的位图可能超过 1000x1000 像素。
我希望通过使用多个线程来加速这个过程,但由于 Bitmap 对象不是线程安全的,它不能直接并发渲染。我的想法是将大位图拆分为每个 cpu 的部分,分别渲染它们,然后在最后将它们重新组合在一起。我还没有这样做,以防你们有更好的建议。
有任何想法吗?谢谢
我正在做的是将多个位图渲染到单个位图。可能有数百个图像,并且被渲染的位图可能超过 1000x1000 像素。
我希望通过使用多个线程来加速这个过程,但由于 Bitmap 对象不是线程安全的,它不能直接并发渲染。我的想法是将大位图拆分为每个 cpu 的部分,分别渲染它们,然后在最后将它们重新组合在一起。我还没有这样做,以防你们有更好的建议。
有任何想法吗?谢谢
您可以使用 LockBits 并处理图像的各个部分。
有关如何完成此操作的示例,您可以查看 Paint.Net 源代码,尤其是BackgroundEffectsRenderer(是的,它是单声道分支的链接,但 Paint.Net 主代码似乎仅在 zip 文件中可用)。
Lee,如果您要使用 Image GDI+ 对象,您可能最终只需要完成所有工作两次。您在多个线程中生成的部分将需要在分而治之的方法结束时重新组合,这不会首先破坏划分的目的吗?
如果您在每个位图部分中执行相当复杂的操作,那么这个问题可能会得到解决,这将比简单地将图像子部分重新绘制到大位图上而无需费心费力地花费更多的处理时间。
希望有帮助。您计划进行什么样的图像渲染?
一种方法是将所有小位图渲染到一个ersatz位图上,该位图只是一个二维int
数组(Bitmap
无论如何,这实际上是一种)。一旦所有的小位图组合到大数组中,您就可以从大数组一次性复制到Bitmap
相同维度的实数中。
我一直使用这种方法(不包括多线程方面)来处理 Windows Mobile 设备上的复杂图形,因为可用于创建“真实”GDI+ 位图的内存非常有限。
您也可以Bitmap
按照最初的意图使用 a 。 Bitmap
不保证是线程安全的,但我不确定这是否会成为问题,只要您可以确保没有两个线程会覆盖位图的同一部分。至少我会试一试。
更新: 我刚刚重新阅读了您的问题,我意识到通过使它们成为多线程,您可能不会看到这些操作的整体速度有太多(如果有的话)改进。这是经典的九个女人不能在一个月内生孩子的问题。
您可以让每个线程写入一个字节数组,然后当它们全部完成后,使用单个线程从字节数组创建一个位图对象。如果所有其他处理都事先完成,那应该很快。
我做了类似的事情,在我的情况下,我让每个线程锁定 x(取决于图像的大小和线程数)图像中的许多行位,并对这些位进行写入,这样就没有线程了重叠了他们的写作。