如何将整数数组转换为内存流?

时间:2011-08-20 13:19:40

标签: c# arrays image memorystream

我有一个二维整数数组。数组中的每个项目是从相机捕获的图像的像素值。我的目的是将图像保存为jpg或位图。我试图使用Image.FromStream()方法来创建图像,然后我可以使用Image.Save()以所需的格式保存图像。 Image.FromStream()以流对象作为参数,因此我需要将整数数组转换为MemoryStream。问题是MemoryStream构造函数只接受字节数组。那我该怎么办?

我在c#中编程

2 个答案:

答案 0 :(得分:1)

您可以逐个元素地将数组写入内存流:

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]);
       }
    }
} 

我不认为可以从包含整数的流创建图像,而是您可能需要创建与数组相同宽度x高度的空位图,然后循环(如上面的代码片段中所示)并根据您的值设置像素。将所有像素设置为位图后,可以将其保存为Jpeg,例如。

答案 1 :(得分:1)

您可以使用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);

开始编辑

抱歉,我没有仔细阅读你的问题。安德斯是对的。你无法创造 来自流的位图,不包含宽度,高度等信息。你可以 使用GCHandle类将int数组转换为IntPtr。然后,实例化一个位图类 与IntPtr:

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

我省略了错误处理。

结束编辑

希望,这有帮助。