2009-03-24 3 views
8

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

Проблема в том, что я получаю исключение 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; 
} 

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

+0

Что произойдет, если вы просто написать ByteArray в файл на диске? Является ли файл открытым с чем-то вроде Photoshop? – Chris

+1

вы решили? У меня та же проблема – robob

ответ

1

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

+1

Здравствуйте, Спасибо за ответ. Но как же тот же массив байтов работает в моем приложении VC++ MFC? Также есть ли способ проверить достоверность данных изображения массива байтов? Arvind K – 2009-03-24 03:52:23

0

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

+0

Hello Chris, Спасибо за ответ. Случается, что каждый раз я запускаю код. – 2009-03-24 03:57:06

3

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

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

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


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

+0

Здравствуйте, Я попытался сохранить изображение в файле jpg, bmp, но я не получаю изображение в файле. Что вызывает недоумение в том, что с одним и тем же массивом байтов я могу отображать изображение в приложении VC++ MFC. – 2009-03-24 03:59:19

+0

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

+0

Приложение VC++ отображает живые изображения с камеры, и поэтому я сделал запись байтового массива в txt-файл. Аналогично, из моего .NET-приложения я написал массив байтов в файл nad, а затем сравнил эти два файла. Я нахожу, что все значения заполнены, и они более или менее одинаковы. – 2009-03-24 04:06:33

3

Я имел эту проблему, делая это:

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(); 
4

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

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

В моем случае мне пришлось «удалить» 8 байтов. новый MemoryStream (byteBlobData, 8, byteBlobData.Length - 8); – iwhp

+3

Как вы могли знать, что это было 8 бит? – C4u

7

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

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

Image.FromStream(new MemoryStream(myImageByteArray));

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

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

0

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

 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(); 
1

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

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

Надеется, что это помогает!

0

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

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; 
} 
Смежные вопросы