Как преобразовать целочисленный массив в поток памяти? - PullRequest
1 голос
/ 20 августа 2011

У меня есть двумерный массив целых чисел. Каждый элемент в массиве представляет собой пиксельное значение изображения, полученного с камеры. Я хочу сохранить изображение в формате jpg или растровое изображение. Я пытаюсь использовать метод Image.FromStream () для создания изображения, а затем я могу использовать Image.Save () для сохранения изображения в нужном формате. Image.FromStream () принимает объект потока в качестве параметра, поэтому мне нужно преобразовать целочисленный массив в MemoryStream. Проблема в том, что конструктор MemoryStream принимает только байтовые массивы. Так что мне делать?

Я программирую на c #

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Вы можете использовать метод System.Buffer.BlockCopy для копирования массива двумерного изображения в плоский массив. Затем используйте класс MemoryStream для создания изображения:

  int[,] imgArray = new int[320, 200];      
  int[] flattenedArray = new int[320 * 200];

  Buffer.BlockCopy(imgArray, 0, flattenedArray, 0, 320 * 200 * sizeof(int));     
  MemoryStream ms = new MemoryStream(flattenedArray);

НАЧАТЬ РЕДАКТИРОВАТЬ

Извините, я недостаточно внимательно прочитал ваш вопрос. Андерс прав. Вы не можете создать точечный рисунок из потока, который не содержит такую ​​информацию, как ширина, высота. Вы могли бы преобразуйте массив int в IntPtr, используя класс GCHandle. Затем создается экземпляр растрового класса с IntPtr:

GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
IntPtr pointer =   handle.AddrOfPinnedObject();
var myBmp = new Bitmap(width, height, stride, PixelFormat.Format32bppRgb,  pointer);

Я пропустил обработку ошибок.

КОНЕЦ РЕДАКТИРОВАНИЯ

Надеюсь, это поможет.

1 голос
/ 20 августа 2011

Вы можете записать массив элемент за элементом в поток памяти:

using(BinaryWriter writer = new BinaryWriter(memoryStream)) 
{
    for(int i=0; i<arr.Length; i++) 
    {
       for(int j=0; j<arr[i].Length; j++) 
       {
          writer.Write(arr[i][j]);
       }
    }
} 

Однако я не думаю, что изображение может быть создано из потока, содержащего целые числа, вместо этого вам, вероятно, нужно создать пустое растровое изображение той же ширины и высоты, что и ваш массив, а затем выполнить цикл (как в фрагменте кода выше) и установите пиксели в соответствии с вашими значениями. После того, как вы установили все пиксели для своего растрового изображения, вы можете сохранить его, например, в формате Jpeg.

...