首页 文章

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

提问于
浏览
6

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

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

有任何想法吗?谢谢

5 回答

  • 0

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

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

  • 1

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

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

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

  • 4

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

  • 0

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

  • 0

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

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

    您也可以按原样使用 Bitmap . Bitmap 不保证是线程安全的,但至少我尝试了一下 .

    Update: 我刚刚重新阅读了你的问题,我意识到你是一个经典的九女不能让宝宝在一个月的问题 .

相关问题