我想将图像从 Java 应用程序传输到 C ++ 应用程序。我使用套接字作为通信方法,现在这适用于字符串。
我希望能够以两种方式传输它(Java< - > C ++)。
图像不是文件,这是内存对象/结构。所以我的主要问题是如何为传输编码图像,以便它可以在Java和C ++中使用。
转移是在同一台机器上(没有网络,所以速度并不重要),但仍然越快/越高效越好。
谢谢
注意:我在C ++中使用OpenCV,主要目标是处理网络摄像头流。我不能/不能使用JavaCV或类似的东西!
答案 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的顺序以及位数)每个)。也许您需要将其作为消息的一部分进行沟通,但也许对于您的应用程序,其中一些事情总是相同的。