36

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

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

的长度byteArrayIn是 169014。尽管其中没有任何值大于 255,但我得到了这个异常。

4

9 回答 9

21

我遇到了同样的问题,显然现在已经解决了,尽管这个和其他一些 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)

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

希望能帮助到你!

于 2009-08-20T03:33:15.590 回答
15

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

请提供更多信息:

  • 哪一行代码抛出异常?
  • 消息是什么?
  • 你从哪里得到byteArrayIn的,你确定它应该包含一个有效的图像吗?
于 2009-03-10T12:48:18.827 回答
7
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);
于 2014-01-14T20:48:13.513 回答
4

抛出的“参数无效”异常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 有效。

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

于 2011-04-09T23:28:44.433 回答
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);
于 2009-03-10T12:43:33.143 回答
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;
于 2011-08-05T07:57:47.213 回答
-2

给出的所有解决方案都不起作用..不要只专注于检索部分。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 错误......已解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!

于 2012-05-08T09:39:44.890 回答
-4

Most of the time when this happens it is bad data in the SQL column. This is the proper way to insert into an image column:

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

Most people do it incorrectly this way:

INSERT INTO [TableX] (ImgColumn) VALUES ('C:\....\Picture 010.png'))
于 2013-02-06T20:52:04.133 回答
-6

只需按照此将值插入数据库

//连接字符串

  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();
于 2017-06-25T21:55:29.057 回答