C#位图图像,字节数组和流!

我有一个函数将文件提取到字节数组(数据)。

int contentLength = postedFile.ContentLength; byte[] data = new byte[contentLength]; postedFile.InputStream.Read(data, 0, contentLength); 

后来我使用这个字节数组来构造一个System.Drawing.Image对象(其中data是字节数组)

  MemoryStream ms = new MemoryStream(data); Image bitmap = Image.FromStream(ms); 

我得到以下exception“ArgumentException:参数无效。”

原始发布的文件包含500k jpeg图像…

任何想法为什么这不起作用?

注意:我向你保证我有一个有效的理由转换为字节数组然后转换为内存流!!

这很可能是因为你没有将所有文件数据都放入字节数组中。 Read方法不必返回您请求的字节数,它返回实际放入数组的字节数。 你必须循环,直到你获得所有数据:

 int contentLength = postedFile.ContentLength; byte[] data = new byte[contentLength]; for (int pos = 0; pos < contentLength; ) { pos += postedFile.InputStream.Read(data, pos, contentLength - pos); } 

从流中读取时这是一个常见的错误。 我已经看过很多次这个问题了。

编辑:
正如马修建议的那样,检查流的早期结束,代码将是:

 int contentLength = postedFile.ContentLength; byte[] data = new byte[contentLength]; for (int pos = 0; pos < contentLength; ) { int len = postedFile.InputStream.Read(data, pos, contentLength - pos); if (len == 0) { throw new ApplicationException("Upload aborted."); } pos += len; } 

您没有检查postingFile.InputStream的返回值。 读 。 完全没有保证在第一次调用时填充arrays。 这将在数​​据中留下损坏的JPEG(0而不是文件内容)。

您是否检查过Read()调用的返回值以validation是否实际读取了所有内容? 也许Read()只返回流的一部分,要求您循环Read()调用,直到消耗掉所有字节。

任何你不这样做的原因:

 Image bitmap = Image.FromStream(postedFile.InputStream); 

我在使用更强大的图像库打开的.NET中加载图像时遇到了问题。 .NET可能不支持您拥有的特定jpeg映像。 jpeg文件不仅仅是一种编码类型,还允许使用各种可能的压缩方案。

您可以尝试使用另一种您知道支持格式的图像。