如何从通过串行端口接收的数据创建 BufferedImage
How to create a BufferedImage from data recived over serial port
我正在做一个项目,我必须从使用 Xbee 连接到我的计算机的相机 (cmucam4) 获取图像。
问题是我可以通过串口获取图像数据,但是当我将它保存为文件时,该文件不能作为图像打开。
我注意到当我用记事本++打开文件时,文件没有像其他图像(相机发送的bmp图像)那样的header。
我尝试使用 ImageIO 保存图像,但我不知道如何将接收到的数据传递给图像!!
BufferedImage img = new BufferedImage(640, 480,BufferedImage.TYPE_INT_RGB);
ImageIO.write(img, "BMP", new File("img/tmp.bmp"));
如果相机真正发送的是BMP格式,直接写入磁盘即可。然而,更有可能的是(这似乎是这种情况,从您的 link 读取规格),卡发送原始位图,这是不一样的。
使用卡规格 PDF 中的信息:
Raw image dumps over serial or to flash card
- (640:320:160:80)x(480:240:120:60) image resolution
- RGB565/YUV655 color space
上面提到的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
数组,用随机数据初始化(因为我显然没有这样的卡) .
我正在做一个项目,我必须从使用 Xbee 连接到我的计算机的相机 (cmucam4) 获取图像。 问题是我可以通过串口获取图像数据,但是当我将它保存为文件时,该文件不能作为图像打开。 我注意到当我用记事本++打开文件时,文件没有像其他图像(相机发送的bmp图像)那样的header。
我尝试使用 ImageIO 保存图像,但我不知道如何将接收到的数据传递给图像!!
BufferedImage img = new BufferedImage(640, 480,BufferedImage.TYPE_INT_RGB);
ImageIO.write(img, "BMP", new File("img/tmp.bmp"));
如果相机真正发送的是BMP格式,直接写入磁盘即可。然而,更有可能的是(这似乎是这种情况,从您的 link 读取规格),卡发送原始位图,这是不一样的。
使用卡规格 PDF 中的信息:
Raw image dumps over serial or to flash card
- (640:320:160:80)x(480:240:120:60) image resolution
- RGB565/YUV655 color space
上面提到的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
数组,用随机数据初始化(因为我显然没有这样的卡) .