从多个线程渲染到单个位图对象

7
我正在将多个位图渲染到单个位图中。可能会有数百张图片,要被渲染的位图可能超过1000x1000像素。
我希望通过使用多个线程来加速此过程,但由于Bitmap对象不是线程安全的,因此不能直接并发地进行渲染。我的想法是将大位图分割成每个CPU一部分,分别进行渲染,然后在最后将它们合并在一起。我还没有尝试这样做,以防您们有更好的建议。
有什么想法吗?谢谢
5个回答

4
你可以使用LockBits来处理图像的各个部分。
要了解如何执行此操作,可以查看Paint.Net源代码,特别是BackgroundEffectsRenderer(是的,这是指向mono分支的链接,但似乎只有zip文件中才有Paint.Net主代码)。

1

如果你要使用Image GDI+对象,Lee,你可能会做两次的工作。在多个线程中生成的部分需要在你的分治方法结束时重新组装,这不会打破一开始的目的吗?

除非你在每个位图部分中做了相当复杂的事情,否则这个问题可能只能克服,这将比仅仅将图像子部分重新绘制到大位图上而不费力更多。

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


是的,我发帖后就想到了这一点,除了将n个位图绘制到一个大位图上之外,没有其他额外的操作,几乎所有时间都花在了DrawImage方法上。需要新的想法。 - Lee Treveil

0
一种方法是将所有小位图渲染到一个“替代”位图上,该位图只是一个二维的int数组(这实际上就是Bitmap)。一旦所有小位图在大数组中合并,就可以将大数组从内存复制到具有相同尺寸的实际Bitmap中。
我常常在Windows Mobile设备上使用这种方法(不包括多线程方面),因为用于创建“真正”的GDI+ Bitmaps的可用内存非常有限。
你也可以像最初打算的那样直接使用Bitmap。虽然Bitmap不能保证线程安全,但只要确保没有两个线程同时覆盖位图的同一部分,就不会有问题。至少应该试一下。
更新:我重新阅读了你的问题,意识到通过将它们多线程化,你可能不会看到这些操作的整体速度有多少提高。这是经典的“九个女人无法在一个月内生一个婴儿”的问题。

0
你可以让每个线程写入一个字节数组,然后当它们全部完成时,使用单个线程从这些字节数组创建一个位图对象。如果所有其他处理都在之前完成,那么这应该非常快速。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接