【问题标题】:How to convert integer array into memory stream?如何将整数数组转换为内存流?
【发布时间】:2011-10-31 05:04:15
【问题描述】:

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

我正在用 c# 编程

【问题讨论】:

  • 你说的是什么语言?请在您的问题中添加相关标签。
  • 哇,我想这很重要! C#
  • 您将必须生成一个有效的图像标题才能完成这项工作。没有那么容易,忘记jpeg。使用 Bitmap.LockBits() 是更好的方法。

标签: c# arrays image memorystream


【解决方案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);

我省略了错误处理。

结束编辑

希望,这会有所帮助。

【讨论】:

    【解决方案2】:

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

    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 高度的空位图,然后循环(如代码 sn-p以上)并根据您的值设置像素。将所有像素设置为位图后,您可以将其另存为 Jpeg。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多