Я расскажу вам столько, сколько знаю.
Сначала вы, кажется, уже знаете о заморозке растровых изображений, прежде чем возвращать их в основной поток.Это хорошее начало.
Однажды я попытался уменьшить количество копий, выведя новую реализацию из BitmapSource, и переопределить виртуальные функции, которые копируют ваши данные из растрового изображения.Это сработало, но привело к большим утечкам памяти.Никогда не понял это.
Конечно, вы также можете создать BitmapSource непосредственно из массива байтов (и потерять служебную информацию из битовой карты GDI). msdn docs
Рассматривали ли вы WriteableBitmap ?Это был ответ команды WPF на общую жалобу на все копии.
Редактировать : MSDN явно говорит (в документации WritableBitmap.BackBuffer), что его можно использовать из фонового потока:
Вы можете передать указатель BackBuffer навнешние компоненты и другие потоки для обработки, но если вы делаете, вы должны предоставить собственную координацию потоков.В частности, вы должны убедиться, что поток пользовательского интерфейса указывает измененные области, вызывая метод AddDirtyRect, и чтобы поток пользовательского интерфейса разблокировал буфер, вызывая метод Unlock.
Так что, если вы позволите потоку пользовательского интерфейса получитьзамок и указатель, вы можете позволить рабочему потоку записывать пиксели.