У вас есть несколько вопросов здесь. Во-первых, принципиально невозможно отобразить изображение такого большого размера (если только у вас не установлен какой-то безумно огромный монитор или несколько мониторов), не уменьшив его до размера, который поместится на обычном экране.
Вы можете выполнить это уменьшение размера, используя Graphics.DrawImage
, но имейте в виду, что даже при высоком качестве InterpolationMode
интерполяция выполняется не более чем на нескольких соседних пикселях, что означает, что ограничение Максимальное количество, которое вы можете уменьшить изображение без серьезной потери информации (обычно до 25%).
Во-вторых, объект Bitmap
в .Net намного сложнее, чем простой массив пикселей. Иногда растровые изображения создаются в видеопамяти вместо общей памяти программ, что ограничивает их максимальный размер более жестко (например, в компактной среде один из конструкторов растровых изображений создает данные пикселей в видеопамяти, которая ограничена 4 МБ вместо 32 МБ, обычно доступный для процесса .NET). В результате не задокументирован максимальный размер для Bitmap
- это внутренняя деталь реализации (затронутая также любыми уже существующими растровыми изображениями), которую программист может обнаружить только трудным путем, получив выброшенное исключение, если оно слишком большой. Поэтому использование Bitmap
для хранения произвольно большого набора точек данных не сработает.
Ваш лучший подход здесь, вероятно, заключался бы в том, чтобы хранить ваши данные в виде обычного двумерного массива (типа int[,]
, вероятно), который мог бы быть произвольно большим без броска OutOfMemoryException
(хотя и без заставления вашего компьютера работать swapfile-crazy), а затем напишите собственный метод, который копирует из этого массива в фактический (и практически размер) Bitmap
. Затем вы скопируете из этого Bitmap
в PictureBox
(или, проще говоря, просто установите это Bitmap
в качестве свойства Image
графического блока - лучше по возможности избегать метода Paint
).