如何通过串行端口

时间:2016-11-30 07:04:24

标签: java bufferedimage javax.imageio

我正在开展一个项目,我必须从相机(cmucam4)获取图像,该图像与Xbee连接到我的计算机。 问题是我可以通过串口获取图像数据,但是当我将其保存为文件时,该文件无法作为图像打开。 我注意到当我用notepad ++打开文件时,文件没有像其他图像一样的标题(相机发送bmp图像)。

我尝试使用ImageIO保存图像,但我不知道如何将已恢复的数据传递给图像!!

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

1 个答案:

答案 0 :(得分:1)

如果相机真正发送BMP格式,您只需将数据写入磁盘即可。但是,更有可能(这似乎就是这种情况,从你的链接中读取规范),这些卡会发送一个原始位图,这是不一样的。

使用卡片规格PDF中的信息:

  

通过串行或闪存卡进行原始图像转储

     
      
  • (640:320:160:80)x(480:240:120:60)图像分辨率
  •   
  • RGB565 / YUV655色彩空间
  •   

上面提到的RGB565像素布局应该与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:上面的代码适用于我,使用长度为640 * 480 * 2的byte数组,用随机数据初始化(因为我显然没有这样的卡)。