如何将整数数组转换为内存流
本文关键字:内存 转换 数组 整数 | 更新日期: 2023-09-27 18:06:06
我有一个二维整数数组。数组中的每个项都是从相机捕获的图像的像素值。我的目的是将图像保存为jpg或位图。我试图使用image . fromstream()方法来创建图像,然后我可以使用image . save()以所需的格式保存图像。fromstream()接受一个流对象作为它的参数,所以我需要将整型数组转换为MemoryStream。问题是MemoryStream构造函数只接受字节数组。那么我该怎么办呢?
我正在用c#编程
可以一个元素一个元素地写入内存流:
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格式。
您可以使用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);
我省略了错误处理。
结束编辑
希望有帮助。