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

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

你在说哪种编程语言?请在你的问题中添加相关的标签。 - Oliver Charlesworth
哇,我猜那是相当重要的!C# - PICyourBrain
你需要生成一个有效的图像头才能使其工作。这并不容易,而且要忘记JPEG格式。使用Bitmap.LockBits()是更好的方法。 - Hans Passant
2个回答

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

开始编辑

抱歉,我没有仔细阅读你的问题。Anders是正确的。如果流中不包含像宽度、高度这样的信息,你无法从流中创建位图。你可以使用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);

我省略了错误处理。

编辑结束

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接