System.ArgumentException:参数无效
c#
image-processing
5
0

我有一个页面将html5画布数据发送到服务器端进程,该数据编码为base64 bmp图像(使用此算法http://devpro.it/code/216.html ),该服务器端进程将其转换为System.Drawing.Image对象,并对它进行一些操作。

在我的本地环境中,这很好,但是在我的ec2实例上,我收到以下错误:

System.ArgumentException:参数无效。在System.Drawing.Image.FromStream(流流,布尔useEmbeddedColorManagement,布尔validateImageData)在System.Drawing.Image.FromStream(流流,布尔useEmbeddedColorManagement)

我的代码如下所示:

System.Drawing.Image image = null;
string b64string = "...";
byte[] sf = Convert.FromBase64String(b64string );
using (MemoryStream s = new MemoryStream(sf, 0, sf.Length))
{
   image = System.Drawing.Image.FromStream(s, false);
}
...

这是一个带有样本b64string的文本文件,我正在使用该文本文件进行测试: https ://docs.google.com/leaf?id=0BzVLGmig1YZ3MTM0ODBiNjItNzk4Yi00MzI5LWI5ZWMtMzU1OThlNWEyMTU5 &hl=zh_CN

我也尝试了以下方法,并得到了相同的结果:

System.Drawing.ImageConverter converter = new System.Drawing.ImageConverter();
image = converter.ConvertFrom(sf) as System.Drawing.Image;         

任何见解将不胜感激!

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我仍然不知道问题的真正原因,但我想它与Image类无法识别的图像格式有关。稍微检查一下二进制数据后,我就可以形成您的图像了。我希望这有帮助。

Bitmap GetBitmap(byte[] buf)
{
    Int16 width = BitConverter.ToInt16(buf, 18);
    Int16 height = BitConverter.ToInt16(buf, 22);

    Bitmap bitmap = new Bitmap(width, height);

    int imageSize = width * height * 4;
    int headerSize = BitConverter.ToInt16(buf, 10);

    System.Diagnostics.Debug.Assert(imageSize == buf.Length - headerSize);

    int offset = headerSize;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            bitmap.SetPixel(x, height - y - 1, Color.FromArgb(buf[offset + 3], buf[offset], buf[offset + 1], buf[offset + 2]));
            offset += 4;
        }
    }
    return bitmap;
}

private void Form1_Load(object sender, EventArgs e)
{
    using (FileStream f = File.OpenRead("base64.txt"))
    {
        byte[] buf = Convert.FromBase64String(new StreamReader(f).ReadToEnd());

        Bitmap bmp = GetBitmap(buf);
        this.ClientSize = new Size(bmp.Width, bmp.Height);
        this.BackgroundImage = bmp;
    }
}
收藏
评论

发布的代码似乎正确。我已经对其进行了测试,并且效果很好。

异常“ System.ArgumentException:参数无效。”没有任何其他提示(尤其不是参数名称)是GDI +(。NET Image类背后的基础技术)标准InvalidParameter错误的包装,该错误不会告诉使用确切的参数是无效的。

因此,按照带有.NET Reflector的FromStream代码,我们可以看到GDI +调用中使用的参数本质上是输入流。

所以我猜您提供的输入流有时作为图像无效吗?您应该保存失败的输入流(例如,使用File.SaveAllBytes(sf))以进行进一步调查。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号