C# - чтение изображения размером в несколько ГБ в массив - PullRequest
2 голосов
/ 25 февраля 2020

Я пытаюсь прочитать большое изображение (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, поэтому простое чтение потока с диска не обрезает его.

1 Ответ

1 голос
/ 26 февраля 2020

Так как я не мог найти способ заставить работать библиотеки. NET, я переключился на https://github.com/dlemstra/Magick.NET

Отлично работает, также для больших изображений, и предоставляет ByteArrays, например, так:

using (MagickImage image = new MagickImage(imagePath)
        {
            image.Format = MagickFormat.Gray;
            byte[] imgarr = image.ToByteArray();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...