我正在尝试将字节数组转换为位图,但它总是显示我:
System.ArgumentException:参数无效。
我的代码如下:
我通过以下网址服务传递字节:
string DecodedString = string.Empty;
DecodedString = System.Text.Encoding.GetEncoding(1251).GetString(bytes);
sResult = sResult + "<Photo>" +XmlConvert.EncodeName(DecodedString) + "</Photo>";
和我的网页:
byte[] bytes = (Byte[])System.Text.Encoding.GetEncoding(1251).GetBytes(XmlConvert.DecodeName(xDocument.SelectSingleNode("Response/Images/Photo").InnerText));
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
System.Drawing.Bitmap b = new System.Drawing.Bitmap(ms);//(System.Drawing.Image.FromStream(ms));
答案 0 :(得分:2)
尝试将字符串作为Base64传递:
string DecodedString = string.Empty;
DecodedString = System.Convert.ToBase64String(bytes)
sResult = sResult + "<Photo>" +XmlConvert.EncodeName(DecodedString) + "</Photo>";
...
byte[] bytes = System.Convert.FromBase64String(xDocument.SelectSingleNode("Response/Images/Photo").InnerText);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
System.Drawing.Bitmap b = System.Drawing.Image.FromStream(ms);
您也不需要使用XmlConvert对字符串进行编码/解码。
答案 1 :(得分:2)
我做到了,在大家的帮助下,这是我的页码
byte[] bytes = System.Convert.FromBase64String(xDocument.SelectSingleNode("Response/Images/Photo").InnerText);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
System.Drawing.Bitmap b = new System.Drawing.Bitmap(ms); //(Bitmap)System.Drawing.Image.FromStream(ms);
System.Drawing.Imaging.FrameDimension frameDim;
frameDim = new System.Drawing.Imaging.FrameDimension(b.FrameDimensionsList[0]);
int NumberOfFrames = b.GetFrameCount(frameDim);
string[] paths = new string[NumberOfFrames];
for (int i = 0; i < NumberOfFrames; i++)
{
b.SelectActiveFrame(frameDim, i);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(b);
paths[i] = imagePathfile.Remove(imagePathfile.Length - 4, 4) + i.ToString() + ".gif";
bmp.Save(paths[i], System.Drawing.Imaging.ImageFormat.Gif);
//bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
bmp.Dispose();
}
Image1.Src = paths[0];
//Check if there's more than 1 image cause its a TIFF
if (paths.Length>1)
{
Image2.Src = paths[1];
}
答案 2 :(得分:0)
我最近遇到了类似的问题,但使用的是Silverlight。我最终需要创建一个自定义HTTP处理程序,以便将定义图像的byte []作为流传递回来。
请参阅http://www.dotnetcurry.com/ShowArticle.aspx?ID=220
编辑:这可以避免担心XML编码,并以二进制形式传回图像... YMMV
答案 3 :(得分:0)
试试这个:
byte[] bytes = System.Convert.FromBase64String(xDocument.SelectSingleNode("Response/Images/Photo").InnerText);
System.Drawing.ImageConverter imageConverter = new System.Drawing.ImageConverter();
Image image = imageConverter.ConvertFrom(bytes) as Image;
System.Drawing.Bitmap b = new System.Drawing.BitMap(image);
修改
看看这个:
答案 4 :(得分:0)
根据MSDN:
ArgumentException - 流没有有效的图像格式
我相信您的问题出在您传递给Web服务的原始byte[]
数组中。
根据你的一条评论,你做了:
System.IO.FileStream fs = new System.IO.FileStream(sPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
int streamLength = Convert.ToInt32(fs.Length);
bytes = new byte[streamLength];
fs.Read(bytes, 0, streamLength);
fs.Read
返回已读入字节数组的字节数;它并不总是读取整个文件!
尝试使用http://www.dotnetspider.com/resources/4515-convert-file-into-byte-array.aspx中的StreamFile
方法。 (Google search)的第一个结果
答案 5 :(得分:0)
实际上我一直遇到这个问题,在我的情况下,当我使用IE浏览器时,没关系,但是当使用其他浏览器时,它总是有相同的错误。
“参数无效异常总是发生在同一行代码中: System.Drawing.Image.FromStream(MS));“
所以我认为这个问题似乎取决于浏览器和图像类型(JPEG,JPEG2000)。
答案 6 :(得分:0)
以下是我用于将字节转换为图像进行单元测试的一些代码:
protected override Image LoadImage()
{
//get a temp image from bytes, instead of loading from disk
//data:image/gif;base64,
byte[] bytes = Convert.FromBase64String("R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==");
Image image;
using (MemoryStream ms = new MemoryStream(bytes))
{
image = Image.FromStream(ms);
}
return image;
}
答案 7 :(得分:-1)
据我了解,由于图像字节的格式不正确,无法显示图像。每种图像格式都有自己的头像。