为什么我的代码中出现“参数无效”异常:
MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
byteArrayIn
的长度是169014.尽管事实上没有任何值大于255,但我得到了这个例外。
答案 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();