为什么我的代码中出现“参数无效”异常:
MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
的长度byteArrayIn
是 169014。尽管其中没有任何值大于 255,但我得到了这个异常。
为什么我的代码中出现“参数无效”异常:
MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
的长度byteArrayIn
是 169014。尽管其中没有任何值大于 255,但我得到了这个异常。
我遇到了同样的问题,显然现在已经解决了,尽管这个和其他一些 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 图像的图像。
希望能帮助到你!
我的猜测是byteArrayIn
不包含有效的图像数据。
请提供更多信息:
byteArrayIn
的,你确定它应该包含一个有效的图像吗?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);
抛出的“参数无效”异常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 有效。
通过将内存流转储到文件并检查内容可能是最容易调试的。
哪一行抛出异常?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);
此错误是由二进制数据插入缓冲区引起的。要解决此问题,您应该在代码中插入一条语句。
这个声明是:
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;
给出的所有解决方案都不起作用..不要只专注于检索部分。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 错误......已解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!
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'))
只需按照此将值插入数据库
//连接字符串
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();