Попытка конвертировать Byte [] в Image ... но есть ли проблемы с платформой? - PullRequest
1 голос
/ 31 марта 2010

Привет,

В настоящее время я пытаюсь разработать приложение, которое использует массив байтов, который передается нам из программы на языке Linux C через TCPClient (поток), и собирает его обратно в изображение / jpg. «Отправляющее» приложение было разработано сторонним разработчиком, который утверждает, что изображение снова собирается в изображение без каких-либо проблем или ошибок в его тестовой среде (все Linux) ...

Однако нам не так повезло. Я (полагаю) мы успешно получаем все отправленные данные, сохраняя их в виде строки (позволяет добавлять поток до его завершения), а затем преобразуем его обратно в байт []. Это, кажется, работает нормально ...

Но когда мы берем байт [], который мы получаем из потоковой передачи (и нашей сборки строк), и пытаемся преобразовать его в изображение с помощью System.Drawing.Image.FromStream (), мы получаем ошибки .... Любой есть идеи, что мы делаем не так? Или кто-нибудь знает, если это кроссплатформенный вопрос? Мы разрабатываем наше приложение для Windows XP и C # .net, но сторонний разработчик выполнил свою работу в c и Linux ... возможно, есть некоторая разница в том, как каждая операционная система объединяет изображения в байтовые массивы?

В любом случае, вот код для преобразования нашего полученного ByteArray (из потока TCPClient) в изображение. Этот код работает, когда мы отправляем образ с тестовой машины, которую мы создали для RUNS на XP, но не из коробки Linux ...

       System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
       byte[] imageBytes = encoding.GetBytes(data);

       MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

       // Convert byte[] to Image
       ms.Write(imageBytes, 0, imageBytes.Length);
       System.Drawing.Image image = System.Drawing.Image.FromStream(ms, false); 
               <-- DIES here, throws a {System.ArgumentException: Parameter is not valid.} error

Буду признателен за любые советы, предложения, теории или ПОМОЩЬ! Пожалуйста, дайте мне знать ???

Наилучшие пожелания всем! Заранее спасибо!

Грег

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

Во-первых, если вы используете строку для хранения ваших двоичных данных, то вы конвертируете свои байтовые значения в Unicode, а затем конвертируете Unicode обратно в байты, чтобы вы могли испортить данные. По крайней мере, вы довольно неэффективны (во времени и пространстве). Отбросьте строку и кодировку ASCII - запишите байты данных непосредственно в поток памяти по мере их получения, и он будет правильно с ними обращаться для сборки двоичного буфера.

Во-вторых, вы создаете MemoryStream из полученного вами буфера. Тогда нет необходимости записывать эти данные в MemoryStream, поскольку они уже были скопированы конструктором - то есть удалите строку ms.Write () вашего примера кода.

Наконец, в зависимости от того, как / если вы сделаете две вещи, описанные выше, вам может потребоваться выполнить поиск () MemoryStream в начале, прежде чем пытаться прочитать данные изображения из него, в противном случае вы попытаетесь прочитать изображение с конца потока и не найти там никаких данных.

0 голосов
/ 31 марта 2010

Данные изображения больше всего похожи на строки Base64. Чтобы подтвердить это, вам нужно отправить первый бит строковых данных.

Если это base64, это способ преобразования в байты:

byte[] imageBytes = Convert.FromBase64String(data);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);

Также убедитесь, что установили MemoryStream.Position в начало:

ms.Flush();
ms.Position = 0;
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, false); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...