Вы используете около гигабайта оперативной памяти, не очень удивительно, что вам не хватает памяти.
Предполагая, что вы используете формат файла 32bpp с 16000x9440 пикселей, вы получаете размер файла примерно:
16000 *9440* (32/8) = ~ 576 МБ
byte[] data = new byte[fileStream.Length];
fileStream.Read(data, 0, data.Length);
using (MemoryStream memoryStream = new MemoryStream(data))
{
[... snip ...]
}
Вы загружаете весь файл в поток памяти, для этого требуется 576 МБ.
[... snip ...]
using (Bitmap src = new Bitmap(memoryStream)) // <-- exception
{
[... snip ...]
}
[... snip ...]
Вы загружаете все содержимое потока в растровое изображение, для этого требуется как минимум еще 576 МБ (в зависимости от того, сколько памяти требуется растровому изображению на пиксель, должно быть не менее 4, вероятно, больше). В этот момент в памяти дважды появляется изображение, которое серьезно мешает таким большим изображениям.
Вы можете уменьшить объем занимаемой памяти, избавившись от потока памяти и загрузив растровое изображение непосредственно из потока файлов.
Другим решением было бы загрузить только часть растрового изображения и загрузить другие части по требованию (так же, как карты Google), но я не могу помочь вам с этим решением, может потребоваться чтение растрового изображения вручную.