Исправлена ошибка "Параметр недействителен" System.Drawing.Image
Почему я получаю исключение "Параметр недействителен" в моем коде:
MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
Длина byteArrayIn
равна 169014. Я получаю это исключение, несмотря на то, что значение в нем больше 255.
Ответы
Ответ 1
У меня была такая же проблема и, по-видимому, сейчас решена, несмотря на это, а некоторые другие исключения 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.
Надеюсь, что это поможет!
Ответ 2
Я предполагаю, что byteArrayIn
не содержит достоверных данных изображения.
Пожалуйста, дайте больше информации:
- Какая строка кода генерирует исключение?
- Что сообщение?
- Откуда вы получили
byteArrayIn
, и уверены ли вы, что он должен содержать допустимое изображение?
Ответ 3
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);
Ответ 4
Какая строка выбрасывает исключение? 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);
Ответ 5
"Параметр недействителен", исключение, созданное 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, чтобы быть действительным.
Может быть проще всего отладить, сбросив поток памяти в файл и проверив содержимое.
Ответ 6
Эта ошибка вызвана тем, что двоичные данные вставляются в буфер.
Чтобы решить эту проблему, вы должны вставить один оператор в свой код.
Это утверждение:
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;
Ответ 7
все предоставленные решения не работают.. не концентрируйтесь только на извлеченной части. luk при вставке изображения. Я сделал ту же ошибку. Я отобразил изображение с жесткого диска и сохранил его в базе данных. Проблема заключается в команде вставки. 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();
}
Вышеприведенный код демонстрирует успешное вложение... но актуально его сохранение изображения в виде неправильного типа данных.. тогда как тип данных должен быть "образ".. поэтому я улучшил код.
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% гарантия, что не будет ПАРАМЕТРА НЕ ВАЛИДНАЯ ошибка в извлечения.... РЕШАЕМ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ответ 8
Просто выполните это, чтобы вставить значения в базу данных
//Строка соединения
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();
Ответ 9
В большинстве случаев, когда это происходит, это плохие данные в столбце 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'))