繁体   English   中英

将byte []转换为Bitmap C#时出现ArgumentException

[英]ArgumentException when converting byte[] to Bitmap c#

我正在尝试将字节数组转换为位图,但它总是向我显示:

System.ArgumentException:参数无效。

我的代码如下:

我通过Web服务传递字节:

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

尝试将字符串作为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对字符串进行编码/解码。

我做到了,在大家的帮助下,这是我的页面代码

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

这是我用于将字节转换为图像以进行单元测试的一些代码:

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

我最近有一个类似的问题,但是使用Silverlight。 我最终需要创建一个自定义HTTP处理程序,以将定义图像的byte []作为流传递回去。

看到http://www.dotnetcurry.com/ShowArticle.aspx?ID=220

编辑:这使您避免担心XML编码,并将图像以二进制形式传递回... YMMV

尝试这个:

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

编辑

看看这个:

通过C#传输Web服务上的任何文件

根据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搜索的第一个结果)

实际上,我曾经遇到过这个问题,以我为例,当我使用IE浏览器时,可以,但使用其他浏览器时,它始终会出现相同的错误。

“参数无效,总是在同一行代码中发生异常:System.Drawing.Image.FromStream(ms));”

因此,我认为此问题似乎取决于浏览器和图像类型(JPEG,JPEG2000)。

据我了解,该图像无法显示,因为该图像的字节格式不正确。 每种图像格式都有其自己的头部或类似内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM