Параметр не является допустимой ошибкой при создании изображения из байта [] в c # - PullRequest
8 голосов
/ 12 марта 2011

Я пытаюсь преобразовать byte[] в Bitmap в c #.Ниже приведен код:

MemoryStream ms = new MemoryStream(b);
Bitmap bmp = new Bitmap(ms);

Показывает ошибку Parameter is not valid при создании Bitmap.

byte[] b поступает из сетевого потока.

Но когда я записываю этот байт [] в файл и открываю этот файл в любой программе просмотра изображений, он просто отлично работает.Ниже приведен код для записи байта [] в файл:

 var fs = new BinaryWriter(new FileStream("tmp.bmp", FileMode.Create, FileAccess.Write));
 fs.Write(b);
 fs.Close();

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ

Здесьмой полный код, который вызывал проблему

 Socket s = listener.AcceptSocket();
 byte[] b = new byte[imgLen];
 s.Receive(b);
 MemoryStream ms = new MemoryStream(b);
 // now here I am using ms.Seek(0, SeekOrigin.Begin); that fixed my problem.
 Bitmap bmp = new Bitmap(ms);
 pictureBox1.Image = bmp;
 s.Close();

Я использую этот код для события Form_Load, и ничего лишнего.Я просто пытаюсь отобразить изображение, которое транслируется в сети.Сервер написан на Java и передает это изображение.

Надеюсь, это прояснит сомнения.

Спасибо

Ответы [ 3 ]

14 голосов
/ 12 марта 2011

Хорошо, просто чтобы прояснить ситуацию немного ... проблема в том, что new Bitmap(ms) будет считывать данные из текущей позиции потока - если поток в данный момент расположен на конце данные, он ничего не сможет прочитать, отсюда и проблема.

В вопросе утверждается, что код такой:

MemoryStream ms = new MemoryStream(b);
Bitmap bmp = new Bitmap(ms);

В этом случае нет требования для сброса положения потока, так как оно уже будет 0. Тем не менее, я подозреваю, что код на самом деле больше похож на это:

MemoryStream ms = new MemoryStream();
// Copy data into ms here, e.g. reading from NetworkStream
Bitmap bmp = new Bitmap(ms);

или, возможно:

MemoryStream ms = new MemoryStream(b);
// Other code which *reads* from ms, which will change its position,
// before we finally call the constructor:
Bitmap bmp = new Bitmap(ms);

В этом случае вам do необходимо сбросить позицию, потому что в противном случае «курсор» потока находится на конце данных вместо начала. Лично я предпочитаю использовать свойство Position вместо метода Seek, просто для простоты, поэтому я бы использовал:

MemoryStream ms = new MemoryStream();
// Copy data into ms here, e.g. reading from NetworkStream

// Rewind the stream ready for reading
ms.Position = 0;
Bitmap bmp = new Bitmap(ms);

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

6 голосов
/ 12 марта 2011

Попробуйте сбросить текущее местоположение в потоке

MemoryStream ms = new MemoryStream(b);
ms.Seek(0, SeekOrigin.Begin);
Bitmap bmp = new Bitmap(ms);
0 голосов
/ 12 марта 2011

Попробуй так:

byte[] b = ...
using (var ms = new MemoryStream(b))
using (var bmp = Image.FromStream(ms))
{
    // do something with the bitmap
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...