Метод Image.FromStream () возвращает исключение Invalid Argument

Я собираю изображения с помощью интеллектуального устройства для камеры и получаю массив байтов из камеры через программирование сокетов (приложение .NET – это клиент, камера – сервер).

Проблема в том, что я получаю исключение System.InvalidArgument во время выполнения.

private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms = new MemoryStream(byteArray); return Image.FromStream(ms, false, false); /*last argument is supposed to turn Image data validation off*/ } return null; } 

Я искал эту проблему на многих форумах и пробовал предложения многих экспертов, но ничего не помогло.

Я не думаю, что есть проблема с массивом байтов как таковая, потому что, когда я корм одного массива байтов в мое клиентское приложение VC ++ MFC, я получаю изображение. Но это не работает в C # .NET.

Может кто-нибудь мне помочь ?

PS:

Другие методы, которые я попытался выполнить для одной и той же задачи:

1.

 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms = new MemoryStream(); ms.Write(byteArray, 0, byteArray.Length); ms.Position = 0; return Image.FromStream(ms, false, false); } return null; } 

2.

 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); Bitmap b = (Bitmap)tc.ConvertFrom(byteArray); return b; } return null; } 

Ни один из вышеперечисленных методов не работал. Незлая помощь.

Image.FromStream() ожидает stream, содержащий ТОЛЬКО одно изображение!

Он сбрасывает stream.Position на 0. У вас есть stream, который содержит несколько изображений или другой материал, вы должны прочитать данные своего изображения в массив байтов и инициализировать MemoryStream с помощью этого:

Image.FromStream(new MemoryStream(myImageByteArray));

MemoryStream должен оставаться открытым до тех пор, пока изображение используется.

Я тоже это заметил. 🙂

Возможно, изображение встроено в поле OLE, и вы должны рассмотреть заголовок OLE объемом 88 байт плюс полезную нагрузку:

 byteBlobData = (Byte[]) reader.GetValue(0); stream = new MemoryStream(byteBlobData, 88, byteBlobData.Length - 88); img = Image.FromStream(stream); 

Я предполагаю, что что-то не так, если вы принимаете файл с сервера. Возможно, вы только получаете часть файла, прежде чем пытаться преобразовать его в Image ? Вы уверены, что это тот же самый массив байтов, который вы подаете на C ++-приложение?

Попробуйте сохранить stream в файл и посмотреть, что вы получаете. Возможно, вы сможете раскрыть некоторые подсказки.

Вы также можете добавить точку останова и вручную сравнить некоторые байты в массиве байтов с тем, что они должны были (если вы это знаете).


Изменить: похоже, что нет ничего плохого в получении данных. Проблема в том, что он в необработанном формате (не в формате, который понимает Image.FromStream ). Здесь может быть использован конструктор Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr) . Или вы можете создать пустую растровую карту и удалить ее вручную из необработанных данных.

У меня была эта проблема при выполнении этого:

 MemoryStream stream = new MemoryStream(); screenshot.Save(stream, ImageFormat.Png); byte[] bytes = new byte[stream.Length]; stream.Save(bytes, 0, steam.Length); 

С последними 2-мя линиями является проблема. Я исправил это, выполнив следующее:

 MemoryStream stream = new MemoryStream(); screenshot.Save(stream, ImageFormat.Png); byte[] bytes = stream.ToArray(); 

И тогда это сработало:

 MemoryStream stream = new MemoryStream(bytes); var newImage = System.Drawing.Image.FromStream(stream); stream.Dispose(); 

System.InvalidArgument означает, что stream не имеет допустимого формата изображения, то есть тип изображения, который не поддерживается.

Попробуй это:

 public Image byteArrayToImage(byte[] item) { Image img=Image.FromStream(new MemoryStream(item)); img.Save(Response.OutputStream, ImageFormat.Gif); return img; } 

Надеюсь, поможет!

У меня была такая же проблема в прошлом, и это было вызвано утечкой в ​​библиотеках GDI Windows, что и использует «Bitmap». Однако, если это происходит все время для вас, то, вероятно, оно не связано.

этот код работает

  string query="SELECT * from gym_member where Registration_No ='" + textBox9.Text + "'"; command = new SqlCommand(query,con); ad = new SqlDataAdapter(command); DataTable dt = new DataTable(); ad.Fill(dt); textBox1.Text = dt.Rows[0][1].ToString(); textBox2.Text = dt.Rows[0][2].ToString(); byte[] img = (byte[])dt.Rows[0][18]; MemoryStream ms = new MemoryStream(img); pictureBox1.Image = Image.FromStream(ms); ms.Dispose(); 

Попробуйте использовать что-то похожее на то, что описано здесь. https://social.msdn.microsoft.com/Forums/vstudio/en-US/de9ee1c9-16d3-4422-a99f-e863041e4c1d/reading-raw-rgba-data-into- а-битовая карта

 Image ImageFromRawBgraArray( byte[] arr, int charWidth, int charHeight, int widthInChars, PixelFormat pixelFormat) { var output = new Bitmap(width, height, pixelFormat); var rect = new Rectangle(0, 0, width, height); var bmpData = output.LockBits(rect, ImageLockMode.ReadWrite, output.PixelFormat); // Row-by-row copy var arrRowLength = width * Image.GetPixelFormatSize(output.PixelFormat) / 8; var ptr = bmpData.Scan0; for (var i = 0; i < height; i++) { Marshal.Copy(arr, i * arrRowLength, ptr, arrRowLength); ptr += bmpData.Stride; } output.UnlockBits(bmpData); return output; } 
Давайте будем гением компьютера.