通过Socket在C ++和Java之间传输图像

时间:2010-09-20 09:36:43

标签: java c++ image sockets encoding

我想将图像从 Java 应用程序传输到 C ++ 应用程序。我使用套接字作为通信方法,现在这适用于字符串。

我希望能够以两种方式传输它(Java< - > C ++)。

图像不是文件,这是内存对象/结构。所以我的主要问题是如何为传输编码图像,以便它可以在Java和C ++中使用。

转移是在同一台机器上(没有网络,所以速度并不重要),但仍然越快/越高效越好。

谢谢

注意:我在C ++中使用OpenCV,主要目标是处理网络摄像头流。我不能/不能使用JavaCV或类似的东西!

3 个答案:

答案 0 :(得分:3)

发送RGB字节怎么样?您可以从BufferedImage获取RGB字节,然后将其作为字节数组发送到C ++层。然后在C ++层构造中使用该字节数组构建图像。

答案 1 :(得分:2)

使用高效的跨语言数据交换格式(如Google protobuf)可能是一种解决方案。 protobuf允许您像这样交换图像对象:

// Java image class

class Image {
    // ...
    byte[] getImageData() {
        return imageData_;
    }

    int getVersion() {
        return version_;
    }
    // ...
}

可以使用以下protobuf消息序列化图像对象:

message ImageMsg {
    required int32 version = 1;
    required bytes imageData = 2;
}

protobuf编译器将根据此定义生成Java和C ++类。从Java中,您将Image序列化为ImageMsg对象:

Image img;
// ...
ImageMsg.Builder msg = ImageMsg.newBuilder();
msg.setVersion(img.getVersion());
msg.setImageData(img.getImageData());
// The output stream could point to a file, socket, pipe or something else.
msg.writeTo(someOutputStream);

在C ++端,从流中读回对象:

std::istream* is;
// initialize istream

ImageMsg msg;    
msg.ParseFromIstream(istream);
Image img(msg.getVersion(), msg.getImageData());

也可以反过来,即将图像对象从C ++发送到Java。

答案 2 :(得分:1)

您应该使用常见的可移植图像格式(例如.png,.gif,.jpg,.bmp),同时记住其中一些是有损的,否则您应该发送原始像素数据。如果您发送原始数据,那么您还必须确保两端都知道图像的高度和宽度,以及像素格式(即通道R,G,B和可能的A的顺序以及位数)每个)。也许您需要将其作为消息的一部分进行沟通,但也许对于您的应用程序,其中一些事情总是相同的。