2016-11-30 3 views
0

Я работаю над проектом, в котором мне нужно получить изображение с камеры (cmucam4), которое связано с моим компьютером с Xbee. Проблема в том, что я могу получить данные изображения через последовательный порт, но когда я сохраняю его как файл, файл нельзя открыть как изображение. Я заметил, что когда я открываю файл с помощью блокнота ++, у файла нет заголовка, как у других изображений (изображение для отправки камеры BMP).Как создать BufferedImage из данных, полученных через последовательный порт

Я попытался сохранить изображение с помощью ImageIO, но я не знаю, как передать данные, полученные на изображение!

BufferedImage img = new BufferedImage(640, 480,BufferedImage.TYPE_INT_RGB);    
ImageIO.write(img, "BMP", new File("img/tmp.bmp")); 

ответ

1

Если камера действительно отправляет BMP-формат, вы можете просто записать данные на диск. Однако, более вероятно (и, похоже, это так, читая спецификации из вашей ссылки), карты отправляют необработанное растровое изображение, что не то же самое.

Используя эту информацию с карты спецификации PDF:

Сырье изображения отвалов через последовательный или флэш-карты

  • (640: 320: 160: 80) х (480: 240: 120 : 60) разрешение изображения
  • RGB565/YUV655 цветовое пространство

RGB565 пикселей макета mentione d выше должно идеально соответствовать BufferedImage.TYPE_USHORT_565_RGB, поэтому это должно быть самым простым в использовании.

byte[] bytes = ... // read from serial port 

ShortBuffer buffer = ByteBuffer.wrap(bytes) 
     .order(ByteOrder.BIG_ENDIAN) // Or LITTLE_ENDIAN depending on the spec of the card 
     .asShortBuffer();   // Our data will be 16 bit unsigned shorts 

// Create an image matching the pixel layout from the card 
BufferedImage img = new BufferedImage(640, 480, BufferedImage.TYPE_USHORT_565_RGB); 

// Get the pixel data from the image, and copy the data from the card into it 
// (the cast here is safe, as we know this will be the case for TYPE_USHORT_565_RGB) 
short[] data = ((DataBufferUShort) img.getRaster().getDataBuffer()).getData(); 
buffer.get(data); 

// Finally, write it out as a proper BMP file 
ImageIO.write(img, "BMP", new File("temp.bmp")); 

PS: Приведенный выше код работает для меня, используя byte массив длиной 640 * 480 * 2, инициализируется случайными данными (как я, очевидно, не имеют такой карты).

+1

Спасибо, это работает. – NYoussef

Смежные вопросы