在Java中转换图像。通过socket传输图像
我有一台笔记本电脑和微控制器评估板MCB1700和微控制器NXP1768。 MCB1700有以太网端口、LCD(320 x 240)等。我有IDEµVision V4。03q用于在MCB1700上开发和下载C程序。此外,我还有用于在MCB1700上下载C程序的ULINK pro设备
我的任务是:
- 为了实现从笔记本电脑读取图像的Java-client,将该图像转换为RGB16(MCB1700的LCD支持这种图像表示),并通过socket连接将其发送给MCB1700
- 在MCB1700上实现服务器,通过插座连接从笔记本电脑接收图像并在LCD上显示李>
- 实际上还有很多其他任务要做,笔记本电脑还必须向MCB1700发送要执行的命令名。但问题是笔记本电脑和MCB1700之间的连接李>
我几乎完成了服务器端的工作。我当前版本的服务器创建被动socket连接并等待客户端。它还可以通过以太网发送和接收数据。 我的Java客户端成功连接到服务器。我通过发送和接收短线来测试它。现在我可以开发它,向服务器发送命令名(例如“SHOW ON LCD:”)和RGB16图像
问题是: 通过socket连接将命令名和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)我发现了这样一种有趣的图像传输方式,通过socket使用这样的ImageIO
方法:
Sending a screenshot (bufferedImage) over a socket in java
public static boolean write(RenderedImage im,
String formatName,
OutputStream output)
BufferedImage image = ....;
ImageIO.write(image, "PNG", socket.getOutputStream());
但我不确定它是否适合我的情况。String formatName
对流有什么影响?我不知道。可能会增加一些额外的字节
# 1 楼答案
它会告知方法编码图像的格式。有关支持的格式,请参见^{}
就编码而言,它可以简单地归结为:
巴布亚新几内亚是一个不错的选择。它不像JPEG那样有损,也不像GIF那样仅限于256色。由于这些原因,它是posting screenshots at stack exchange sites的推荐格式