Я пытаюсь прочитать большое изображение (30.000 x 20.000 пикселей²) в массив в C#. Изображение в Gray16, поэтому 16bpp.
В настоящее время я пытаюсь это сделать:
BitmapSource bitmapSource = null;
bitmapSource = new BitmapImage(new Uri(filepath));
int stride = (bitmapSource.PixelWidth * bitmapSource.Format.BitsPerPixel) / 8;
long array_size = bitmapSource.PixelHeight * stride;
Array pixels_byte = Array.CreateInstance(typeof(ushort), array_size);
bitmapSource.CopyPixels(pixels_byte, stride, 0);
Это прекрасно работает для небольших изображений (например, 10MP и прочее). Но для большого изображения я получаю System.OverflowException: 'Arithmetic operation resulted in an overflow'
для последней строки (CopyPixels
).
Я понимаю, что обычно означает это исключение - но я не знаю, как исправить это здесь. CopyPixels
принимает только целые числа и, кроме того, 1,2 миллиарда для array_size
, что еще далеко от Int32.MaxValue
из 2 миллиардов.
Есть ли способ использовать встроенные инструменты изображения для чтения в изображениях такого размера? Изображения приходят в кодировке bmp / png / jpeg, поэтому простое чтение потока с диска не обрезает его.