【问题标题】:Transforming of images in Java. Transferring of images through socketsJava中的图像转换。通过套接字传输图像
【发布时间】:2012-05-06 08:27:09
【问题描述】:

我有一台笔记本电脑和带有微控制器 NXP1768 的微控制器评估板 MCB1700。 MCB1700 有以太网端口、LCD (320 x 240) 等。我有 IDE µVision V4.03q 用于在 MCB1700 上开发和下载 C 程序。我还有 ULINK-pro 设备,用于在 MCB1700 上下载 C 程序。

我的任务是:

  1. 实现笔记本电脑的Java-客户端,从笔记本电脑读取图像,将此图像转换为RGB16(MCB1700的LCD支持这种图像表示)并通过套接字连接将其发送给MCB1700
  2. 在 MCB1700 上实现服务器,通过 Socket 连接从笔记本电脑接收图像并将其显示在 LCD 上。
  3. 实际上还有很多其他任务要做,笔记本电脑还必须向 MCB1700 发送要执行的命令名称。但问题是关于笔记本电脑和 MCB1700 之间的连接。

我几乎已经完成了服务器端。我当前版本的服务器创建被动套接字连接并等待客户端。它还可以通过以太网发送和接收数据。 我的 Java 客户端成功连接到服务器。我通过发送和接收短线来测试它。现在我可以开发它来向服务器发送命令的名称(例如“SHOW ON LCD:”)和 RGB16 图像。

问题是: 通过套接字连接将命令的名称和 RGB16 图像从 Java 客户端发送到 MCB1700 服务器(在 C 上实现)以便在服务器 C 程序中方便地转换数据的最佳方法是什么?以字节数组的形式发送所有数据会很棒:

MCB1700-server 必须以字节序列的形式接收数据

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-client 中读取和转换图像?

4) 我发现了这种有趣的图像传输方式,使用这种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 对流有什么影响?我没有任何想法。可能是它增加了一些额外的字节......

【问题讨论】:

  • 据我统计,您有 6 个问题。你想要每个答案的 1/6,还是我应该随机选择一个来回答?或者换一种说法,尝试将其限制为每个帖子一个问题 - 我认为一个非常无聊的人会回答所有 6 个问题(甚至阅读所有问题)。
  • 对不起,我是这个资源的新手。昨天没看到你评论。我想知道最后一个问题的答案。这对我来说很重要。

标签: java image sockets


【解决方案1】:
ImageIO.write(image, "PNG", socket.getOutputStream());

String formatName 对流有何影响?

它通知方法以什么格式对图像进行编码。支持的格式见ImageIO.getWriterFileSuffixes()

在编码方面,它简单地归结为:

  1. 使用已知且受支持的格式。
  2. 在发送方使用与接收方相同的格式。

PNG 是一个不错的选择。它不像JPEG那样有损,也不像GIF那样局限于256色。由于这些原因,它是posting screenshots at stack exchange sites唯一推荐格式。

【讨论】:

  • 感谢您的回答。但我不需要任何格式(“PNG”、“JPEG”等)。微控制器不支持它们。我想发送一个像 RGB565 像素序列的图像(例如: 12_1F 24_C3 ... 67_02 )。服务器(在 C 语言上实现)接收它,在数据字段上设置(无符号短 *)指针,我们可以通过该指针访问图像矩阵的像素 [0][0](12_1F)。在操作指针++之后,我们可以访问下一个像素 [0][1] (24_C3) 等等...是否可以使用 ImageIO.write(...) 或其他方式?
猜你喜欢
  • 2014-03-25
  • 2012-09-07
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2014-09-25
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多