【问题标题】:C# bitmap images, byte arrays and streams!C# 位图图像、字节数组和流!
【发布时间】:2010-10-30 06:16:48
【问题描述】:

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

        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);

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

原始发布的文件包含一个 500k 的 jpeg 图像...

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

注意:我向你保证,我有充分的理由先转换为字节数组,然后再转换为内存流!!

【问题讨论】:

  • 数据是否只包含图像数据?你不说postedFile是什么类型。
  • 你在哪里得到这个错误?您发布的代码应该可以正常工作...
  • postedFile 是一个 HttpPostedFileBase。错误发生在 Image bitmap = Image.FromStream(ms); :(

标签: c# arrays image stream byte


【解决方案1】:

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

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

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

编辑:
正如 Matthew 建议的那样,通过检查流的提前结束,代码将是:

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;
}

【讨论】:

  • 使用了建议的代码:int contentLength = postedFile.ContentLength;字节[]数据=新字节[内容长度]; for (int pos = 0; pos
  • 您还应该检查是否返回 0,以防您提前结束流。
  • @ListenToRick:您在 for 语句中添加了一个不应该存在的额外 p++。这将在您读取的数据块之间产生一个字节的间隙。
  • 想到了.... 在之前的函数中,我从流中读取了标头信息。这恰好是 4 个字节(我正在检查 jpg)。从流中读取并传递给文件的数据量缺少 4 个字节!!!傻傻傻傻!!
  • @ListenToRick,只有在到达流的末尾时才会返回 0。对于您的嗅探问题,您基本上需要记住这 4 个字节,将它们复制到数据中(只有在您确定有 JPEG 时才能创建),并适当地设置 pos。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您是否检查过 Read() 调用的返回值,以确认它实际上正在读取所有内容?也许 Read() 只返回流的一部分,需要您循环 Read() 调用,直到所有字节都被消耗完。

    【讨论】:

      【解决方案4】:

      您不这样做的任何理由:

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

      【讨论】:

      • > 注意:我向你保证我有一个有效的 > 理由来转换为字节数组 > 然后转换为内存流!
      【解决方案5】:

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

      您可以尝试使用您知道格式受支持的另一张图片。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 2013-07-29
        相关资源
        最近更新 更多