2009-03-16 1 views
5

Что делает im, это рендеринг нескольких растровых изображений в одно растровое изображение. Могут быть сотни изображений, а растровое изображение может быть более 1000x1000 пикселей.Рендеринг на один объект Bitmap из нескольких потоков

Im надеясь ускорить этот процесс, используя несколько потоков, но поскольку объект Bitmap не является потокобезопасным, он не может быть передан непосредственно одновременно. То, что я думаю, состоит в том, чтобы разбить большой битмап на разделы на процессор, сделать их отдельно, а затем объединить их в конце. Я еще не делал этого, пока вы не нашли, чтобы у вас, ребята/девушки, были лучшие предложения.

Любые идеи? Спасибо

ответ

0

Вы можете написать каждый поток в байтовый массив, а затем, когда все они закончены, используйте один поток для создания растрового объекта из массивов байт. Если вся другая обработка была сделана заранее, это должно быть довольно быстро.

1

Ли, если вы собираетесь использовать объект Image GDI +, вы можете просто завершить всю работу дважды. Секции, которые вы создаете в нескольких потоках, нужно будет собрать в конце вашего подхода к разделению и завоеванию, и разве это не победит цель деления в первую очередь?

Эта проблема может быть решена только в том случае, если вы выполняете что-то довольно сложное в каждой из разделов растровых изображений, что будет намного большим временем обработки, чем просто перерисовать подстроки изображения на большом растровом изображении, не обойдя все эти проблемы.

Надеюсь, что это поможет. Какую визуализацию изображений вы планируете?

+0

Да, я думал, что сразу после того, как я отправил сообщение, нет ничего лишнего, кроме рисования n битмапсов на один большой, почти все время проведенное в методе DrawImage. Нужна новая идея. –

0

Я сделал что-то подобное, и в моем случае у меня была каждая блокировка потока x (зависит от размера изображения и количества потоков) от множества строк битов в изображении и записывала их в эти биты что ни одна нить не перекрывает их записи.

4

Вы можете использовать LockBits и работать с отдельными разделами изображения.

Для примера того, как это делается, вы можете посмотреть исходный код Paint.Net, особенно BackgroundEffectsRenderer (да, это ссылка на моно-ветвь, но основной код Paint.Net, по-видимому, доступен только в zip-файлы).

0

Один подход должен был бы вынести все малые растровые изображения на в эрзац точечного рисунка, который будет просто двумерный массив int (который вроде все в Bitmap действительно так или иначе). Когда все маленькие растровые изображения объединены в большом массиве, вы делаете однократную копию из большого массива в реальный Bitmap тех же размеров.

Я использую этот подход (не включая многопоточный аспект) все время для сложной графики на устройствах Windows Mobile, поскольку память, доступная для создания «реальных» GIM + битмап, сильно ограничена.

Вы также можете использовать Bitmap, как вы изначально планировали. Bitmap не гарантируется для потокобезопасности, но я не уверен, что это будет проблемой, если бы вы могли убедиться, что ни один из двух потоков не перезапишет одну и ту же часть растрового изображения. По крайней мере, я бы попробовал.

Обновление: Я просто перечитал ваш вопрос, и я понял, что вы, вероятно, не увидите многого (хотя бы) улучшения общей скорости этих операций, сделав их многопоточными. Это классическая проблема с девятью женщинами-не-мама-ребенок-в-одном месяце.

Смежные вопросы