我有一个页面发送html5画布数据,编码为base64 bmp图像(使用此算法http://devpro.it/code/216.html)到服务器端进程,将其转换为System.Drawing.Image对象并对其执行一些操作
在我的本地环境中,这很好用,但在我的ec2实例上,我收到以下错误:
System.ArgumentException:参数无效。在 System.Drawing.Image.FromStream(Stream stream,Boolean useEmbeddedColorManagement,Boolean validateImageData)at System.Drawing.Image.FromStream(Stream stream,Boolean 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=en_US
我也尝试了以下内容并得到了相同的结果:
System.Drawing.ImageConverter converter = new System.Drawing.ImageConverter();
image = converter.ConvertFrom(sf) as System.Drawing.Image;
非常感谢任何见解!
答案 0 :(得分:5)
我仍然不知道你问题的真正原因,但我猜它与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;
}
}
答案 1 :(得分:3)
发布的代码似乎是正确的。我测试了它,它工作正常。
异常“System.ArgumentException:参数无效”。没有任何其他提示(尤其不是参数的名称)是GDI +(.NET Image类背后的基础技术)标准InvalidParameter错误的包装器,它不会告诉使用什么参数无效。
因此,遵循.NET Reflector的FromStream
代码,我们可以看到GDI +调用中使用的参数本质上是......输入流。
所以我的猜测是你提供的输入流有时会像图像一样无效?您应该保存失败的输入流(例如,使用File.SaveAllBytes(sf))进行进一步调查。
答案 2 :(得分:0)
如果sf
包含无效的图像数据,则可能会发生这种情况。验证您传入流中的数据的有效性,并查看是否可以解决您的问题。