Преобразование изображений в Java.Передача изображений через сокеты - PullRequest
1 голос
/ 17 ноября 2011

У меня есть ноутбук и оценочная плата микроконтроллера MCB1700 с микроконтроллером NXP1768.MCB1700 имеет порт Ethernet, ЖК-дисплей (320 x 240) и т. Д. У меня есть IDE µVision V4.03q для разработки и загрузки C-программ на MCB1700.Также у меня есть устройство ULINK-pro для загрузки C-программ на MCB1700.

Моя задача:

  1. реализовать Java-клиент для ноутбука, который читает изображение с ноутбука, конвертирует это изображениена RGB16 (ЖК-дисплей MCB1700 поддерживает такое представление изображений) и отправляет его на MCB1700 через сокетное соединение
  2. для реализации сервера на MCB1700, который получает изображения с ноутбука через Socket-соединение и отображает его на ЖК-дисплее.
  3. На самом деле нужно выполнить много других задач, и ноутбук должен также отправить MCB1700 название команды для выполнения.Но вопрос о соединении между ноутбуком и MCB1700.

Я почти сделал на стороне сервера.Моя текущая версия сервера создает пассивное сокетное соединение и ждет клиента.Он также может отправлять и получать данные через Ethernet.Мой Java-клиент успешно подключается к серверу.Я проверял это, отправляя и получая короткие строки.Теперь я могу разработать его для отправки на сервер имени Команды (например, «ПОКАЗАТЬ НА ЖКД:») и RGB16-изображение.

Вопрос в том, как лучше всего отправить имя Команды иRGB16-образ от Java-клиента до MCB1700-сервера (реализован на C) через сокет-соединение для удобного приведения данных в C-программу сервера?Было бы здорово отправить все данные в виде байтового массива:

MCB1700-сервер должен получать данные в виде последовательности байтов

char* "SHOW ON LCD:" - bytes 0 - 11
unsigned short**
RGB16-Pixel[0][0] = 09 AE - bytes 12 - 13
RGB16-Pixel[0][1] =  14 1C    -   bytes 14 - 15
RGB16-Pixel[319][239] =  78 9F     -   bytes 76810 - 76811      

(извините за качество этой иллюстрации)

Как лучше всего прочитать изображение любого формата в Java-клиенте и отправить его на MCB1700 в виде байтового массива (как на картинке выше)?Какие функции, классы я должен использовать?На самом деле, у меня есть несколько идей:

1) Я могу каким-то образом поместить изображение (пока не знаю, как) в объект типа BufferedImage (он поддерживает необходимый формат изображения):

BufferedImage image =
    new BufferedImage(320, 240, TYPE_USHORT_565_RGB);

2) Читайте каждый его пиксель в цикле.

int oldRGB = image.getRGB(250, 180);

3) И отправляйте каждый пиксель изображения последовательно, байт за байтом

Socket connectionToDevice;  //Socket
 OutputStream outToServerStream;
 outToServerStream = connectionToDevice.getOutputStream();
 outToServerStream.write(    bytes of pixel to send   );

Есть ли ещеИзящный способ выполнить эту задачу?Как читать и преобразовывать изображение в Java-клиенте?

4) Я нашел такой интересный способ передачи изображения через сокет с использованием такого метода ImageIO: Отправка снимка экрана (bufferedImage) поверхсокет в java

public static boolean write(RenderedImage im,
                            String formatName,
                            OutputStream output)


BufferedImage image = ....;
ImageIO.write(image, "PNG", socket.getOutputStream());

Но я не уверен, что он подходит в моем случае.Как String formatName влияет на поток?Понятия не имею.Может быть, это добавляет несколько дополнительных байтов ...

1 Ответ

1 голос
/ 19 ноября 2011
ImageIO.write(image, "PNG", socket.getOutputStream());

Как String formatName влияет на поток?

Он информирует метод о том, в каком формате кодировать изображение. Поддерживаемые форматы см. В ImageIO.getWriterFileSuffixes().

В терминах кодирования это просто сводится к:

  1. Используйте известный поддерживаемый формат.
  2. Используйте тот же формат у отправителя, что и у получателя.

PNG - хороший выбор. Он не с потерями, как JPEG, и не ограничен 256 цветами, как GIF. По этим причинам это только рекомендуемый формат для размещения скриншотов на сайтах обмена стека .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...