“参数无效”异常加载System.Drawing.Image

时间:2009-03-10 12:40:46

标签: c# image stream argumentexception

为什么我的代码中出现“参数无效”异常:

MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);

byteArrayIn的长度是169014.尽管事实上没有任何值大于255,但我得到了这个例外。

9 个答案:

答案 0 :(得分:18)

我遇到了同样的问题,现在显然已经解决了,尽管有这个和其他一些gdi +异常非常误导,我发现实际问题是发送到Bitmap构造函数的参数无效。我有这段代码:

using (System.IO.FileStream fs = new System.IO.FileStream(inputImage, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
{
    try
    {
        using (Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false))
        {
            try
            {
                bitmap.Save(OutputImage + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
                GC.Collect();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    catch (ArgumentException aex)
    {
        throw new Exception("The file received from the Map Server is not a valid jpeg image", aex);
    }
}

以下行导致错误:

Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false)

文件流是从从Map Server下载的文件构建的。我的应用程序错误地发送请求以获取图像,并且服务器返回了jpg扩展名的内容,但实际上是一个html告诉我发生了错误。所以我正在拍摄该图像并试图用它构建一个Bitmap。 修复是控制/验证图像的有效jpeg图像。

希望它有所帮助!

答案 1 :(得分:14)

我的猜测是byteArrayIn不包含有效的图片数据。

请提供更多信息:

  • 哪一行代码抛出异常?
  • 信息是什么?
  • 你从哪里得到byteArrayIn,你确定它应该包含有效图像吗?

答案 2 :(得分:4)

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
ImageConverter imageConverter = new System.Drawing.ImageConverter();
System.Drawing.Image image = imageConverter.ConvertFrom(fileData) as System.Drawing.Image;
image.Save(imageFullPath, System.Drawing.Imaging.ImageFormat.Jpeg);

答案 3 :(得分:3)

哪一行抛出异常? new MemoryStream(...)?还是Image.FromStream(...)?什么是byteArrayIn?是byte[]吗?我只是因为评论“其中没有任何值不大于255”而提出要求 - 当然这对byte[]来说是自动的。

作为一个更明显的问题:二进制文件实际上是否包含合理格式的图像?

例如,以下(虽然不是很好的代码)可以正常工作:

    byte[] data = File.ReadAllBytes(@"d:\extn.png"); // not a good idea...
    MemoryStream ms = new MemoryStream(data);
    Image img = Image.FromStream(ms);
    Console.WriteLine(img.Width);
    Console.WriteLine(img.Height);

答案 4 :(得分:1)

Image.FromStream()抛出的“参数无效”异常会告诉您该流不是“有效”或“已识别”格式。观察内存流,特别是如果从文件中获取各种字节偏移量。

// 1. Create a junk memory stream, pass it to Image.FromStream and 
// get the "parameter is not valid":
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);`

// 2. Create a junk memory stream, pass it to Image.FromStream
// without verification:
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms, false, true);

示例2将起作用,请注意useEmbeddedColorManagement必须为false才能使validateImageData有效。

通过将内存流转储到文件并检查内容,可能最容易进行调试。

答案 5 :(得分:1)

此错误是由二进制数据插入缓冲区引起的。 要解决此问题,您应该在代码中插入一个语句。

这句话是:

obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));

示例:

FileStream obj_FileStream = new FileStream(str_ImagePath, FileMode.OpenOrCreate, FileAccess.Read);
Byte[] Img = new Byte[obj_FileStream.Length];
obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));         
dt_NewsFeedByRow.Rows[0][6] = Img;

答案 6 :(得分:-2)

所有给出的解决方案都不起作用..不要只关注检索部分。 luk插入图像。我犯了同样的错误。我从硬盘上获取图像并将其保存到数据库中。问题在于insert命令。 luk在我的错误代码..:

 public bool convertImage()
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
            photo = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo, 0, photo.Length);
            return true;
        }
        catch
        {
            MessageBox.Show("image can not be converted");
            return false;
        }
    }
    public void insertImage()
    {
       // SqlConnection con = new SqlConnection();
        try
        {
            cs.Close();
            cs.Open();
            da.UpdateCommand = new SqlCommand("UPDATE All_students SET disco = " +photo+" WHERE Reg_no = '" + Convert.ToString(textBox1.Text)+ "'", cs);
            da.UpdateCommand.ExecuteNonQuery();
            cs.Close();
            cs.Open();
            int i = da.UpdateCommand.ExecuteNonQuery();
            if (i > 0)
            {
                MessageBox.Show("Successfully Inserted...");
            }

        }
        catch
        {
            MessageBox.Show("Error in Connection");
        }
        cs.Close();
    }

上面的代码显示成功插入...但实际上它以错误的数据类型的形式保存图像..而数据类型必须bt“图像”..所以我改进了代码..

  public bool convertImage()
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
            photo = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo, 0, photo.Length);
            return true;
        }
        catch
        {
            MessageBox.Show("image can not be converted");
            return false;
        }
    }
    public void insertImage()
    {
       // SqlConnection con = new SqlConnection();
        try
        {
            cs.Close();
            cs.Open();
            //THIS WHERE THE CODE MUST BE CHANGED>>>>>>>>>>>>>>

            da.UpdateCommand = new SqlCommand("UPDATE All_students SET disco = @img WHERE Reg_no = '" + Convert.ToString(textBox1.Text)+ "'", cs);
            da.UpdateCommand.Parameters.Add("@img", SqlDbType.Image);//CHANGED TO IMAGE DATATYPE...
            da.UpdateCommand.Parameters["@img"].Value = photo;
            da.UpdateCommand.ExecuteNonQuery();
            cs.Close();
            cs.Open();
            int i = da.UpdateCommand.ExecuteNonQuery();
            if (i > 0)
            {
                MessageBox.Show("Successfully Inserted...");
            }

        }
        catch
        {
            MessageBox.Show("Error in Connection");
        }
        cs.Close();
    }

100%保证在检索时不会出现PARAMETER NOT VALID错误....已解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!

答案 7 :(得分:-3)

大多数情况下,当发生这种情况时,它是SQL列中的错误数据。这是插入图像列的正确方法:

INSERT INTO [TableX] (ImgColumn) VALUES (
(SELECT * FROM OPENROWSET(BULK N'C:\....\Picture 010.png', SINGLE_BLOB) as tempimg))

大多数人这样做不正确:

INSERT INTO [TableX] (ImgColumn) VALUES ('C:\....\Picture 010.png'))

答案 8 :(得分:-4)

按照此操作将值插入数据库

//连接字符串

  con.Open();

sqlQuery = "INSERT INTO [dbo].[Client] ([Client_ID],[Client_Name],[Phone],[Address],[Image]) VALUES('" + txtClientID.Text + "','" + txtClientName.Text + "','" + txtPhoneno.Text + "','" + txtaddress.Text + "',@image)";

                cmd = new SqlCommand(sqlQuery, con);
                cmd.Parameters.Add("@image", SqlDbType.Image);
                cmd.Parameters["@image"].Value = img;
            //img is a byte object
           ** /*MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat);
            byte[] img = ms.ToArray();*/**

                cmd.ExecuteNonQuery();
                con.Close();