将ByteArray数组转换为MemoryStream

3

我有一个返回 ByteArray 数组的方法:

public byte[][] Draw(ImageFormat imageFormat, ImageSize imageSize);

我需要将它写入一个MemoryStream中:

var byteArray = instanceName.Draw(ImageFormat.Jpeg, ImageSize.Dpi150);
MemoryStream ms = new MemoryStream(byteArray[0]);

这迄今为止是行得通的,因为byteArray数组只有一个元素。如果byteArray数组有多个元素会发生什么?请问有人能指出问题并提供解决方案吗?
我猜以当前的代码,我仍然会取byteArray的第一个元素并丢弃其余的元素,但我需要MemoryStream,它不能使用多维数组。
2个回答

1

你需要循环并编写类似以下的代码:

var ms = new MemoryStream();
for(var i=0; i < byteArray.Length; i++)
  ms.Write(byteArray[i], 0, byteArray[i].Length);

我不确定它是否可以直接使用,你可能需要进行调整,但这是原则。


这个可能行不通,因为在除了第一个元素之外的元素中,Write 字节偏移量的第二个参数不会是0。虽然答案不错。 - VoodooChild
2
嗯,不是吗?这是开始写入的偏移量,而不是结束的偏移量。 - Onkelborg
你是对的,它是缓冲区中开始写入的字节偏移量。那么这样就可以直接使用了,是吗? - VoodooChild
可能吧,但我还没有测试过,所以可能会出现编译错误或类似的问题:P - Onkelborg

0

正如您所提到的,内存流只使用[0]位置上的第一个元素。由于内存流是按顺序设计的,您需要循环来展平数组并将其放入内存流中。 对于您的代码,我建议您将Draw()方法更改为生成线性数据结构,而不是二维(数组的数组),如果您在代码中没有其他需要这种类型的数据结构。


我不能这样做,因为这是第三方控件-我已经考虑过了 :) - VoodooChild
然后在它周围编写一个包装类。 - Xaqron
好的,如果第三方控件返回一个byteArray数组有其原因,我们是否应该编写一个包装类来更改原始函数的返回类型呢? - VoodooChild
这取决于您要多频繁地对2D内存模型进行平整。如果频繁进行平整,那么我会编写一个包装类来封装仅一个方法。 - Xaqron

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