Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于socket的C++与java的图像传输 我想把一个java应用程序的图像传输到C++应用程序。我使用套接字作为通信方法,目前这对字符串很有效 我想能够双向传输java C++。< /p>_Java_C++_Image_Sockets_Encoding - Fatal编程技术网

基于socket的C++与java的图像传输 我想把一个java应用程序的图像传输到C++应用程序。我使用套接字作为通信方法,目前这对字符串很有效 我想能够双向传输java C++。< /p>

基于socket的C++与java的图像传输 我想把一个java应用程序的图像传输到C++应用程序。我使用套接字作为通信方法,目前这对字符串很有效 我想能够双向传输java C++。< /p>,java,c++,image,sockets,encoding,Java,C++,Image,Sockets,Encoding,图像不是文件,而是内存对象/结构。所以我的主要问题是如何对图像进行编码,以便它可以在java和C++中使用。 传输是在同一台没有网络的机器上进行的,因此速度并不重要,但速度越快/效率越高越好 多谢各位 注:我在C++中使用OpenCV,主要目标是处理网络摄像头流。我不/不能使用JavaCV或类似的东西 发送RGB字节怎么样。您可以从缓冲区得到RGB字节,然后将其作为字节数组发送到C++层。然后在C++层中使用该字节数组构造图像。 < P>如何发送RGB字节。您可以从缓冲区得到RGB字节,然后将其

图像不是文件,而是内存对象/结构。所以我的主要问题是如何对图像进行编码,以便它可以在java和C++中使用。 传输是在同一台没有网络的机器上进行的,因此速度并不重要,但速度越快/效率越高越好

多谢各位


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

发送RGB字节怎么样。您可以从缓冲区得到RGB字节,然后将其作为字节数组发送到C++层。然后在C++层中使用该字节数组构造图像。

< P>如何发送RGB字节。您可以从缓冲区得到RGB字节,然后将其作为字节数组发送到C++层。然后在C++层中使用该字节数组构造图像。

你应该使用一个公共的便携图像格式,比如.pNG,.gif,.jpg,.bmp,记住有些是有损的,或者你应该发送原始像素数据。如果发送原始数据,则还必须确保两端都知道图像高度和宽度,以及像素格式,即通道R、G、B和A的顺序,以及每个通道的位数。也许您需要将其作为信息的一部分进行沟通,但对于您的应用程序来说,其中的一些内容始终是相同的。

您应该使用通用的便携式图像格式,如.png、.gif、.jpg、.bmp,记住其中一些是有损的,或者您应该发送原始像素数据。如果发送原始数据,则还必须确保两端都知道图像高度和宽度,以及像素格式,即通道R、G、B和A的顺序,以及每个通道的位数。也许您需要将其作为消息的一部分进行通信,但对于您的应用程序来说,其中的一些内容始终是相同的。

使用高效的跨语言数据交换格式,例如,可能是一个解决方案。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;
}

原Bug编译器将从这个定义生成java和C++类。从Java将图像序列化为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。< /p> 使用高效的跨语言数据交换格式,可能是一种解决方案。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;
}

原Bug编译器将从这个定义生成java和C++类。从Java将图像序列化为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。< /P>是的,这看起来很简单,但是我想也许有一种更快/更有效的方法。因为这意味着要通过java和C++中的图像的每个像素。马蒂厄:每秒需要多少次?如果没有一些代码,在某个地方访问每个像素,就无法传输图像。理论上讲,java程序可能会用JNI将一个完整的图像缓冲区写入C++程序所需的格式,然后C++程序可以直接传递给图形API,它用作屏幕缓冲区,纹理等。您可以发送230&0,而不是发送230个零,并且接收方知道如何重新组合值。一个基本的算法可能是对每个扫描行{RLE编码一行数据;发送较小的数据-RLE或原始数据}。更复杂的是将整个部分从java中输入到zip流中,并在C++中使用zLIB来解压缩。@史提夫:越快越好,这是实时的,就像网络摄像头流。看看BWT Burrer-Welver变换。我正在压缩类似XML的文件,以便通过广域网发送,压缩/解压缩大约3000字节,其中压缩/解压缩所花费的时间超过了传输时间。在我的例子中,本垒BWT的表现优于ZLib。是的,这似乎是一种简单的方法,但我认为可能有一种更快/更有效的方法。因为这意味着要通过java和C++中的图像的每个像素。马蒂厄:每秒需要多少次?如果没有一些代码,在某个地方访问每个像素,就无法传输图像。我想理论上你的Java程序可能会

TH JNI将C++中的程序所需的格式写入到共享内存中,然后C++程序直接传递给图形API,它用作屏幕缓冲区、纹理等,RGB大小可以通过游程长度编码来减少。您可以发送230&0,而不是发送230个零,并且接收方知道如何重新组合值。一个基本的算法可能是对每个扫描行{RLE编码一行数据;发送较小的数据-RLE或原始数据}。更复杂的是将整个部分从java中输入到zip流中,并在C++中使用zLIB来解压缩。@史提夫:越快越好,这是实时的,就像网络摄像头流。看看BWT Burrer-Welver变换。我正在压缩类似XML的文件,以便通过广域网发送,压缩/解压缩大约3000字节,其中压缩/解压缩所花费的时间超过了传输时间。在我的例子中,homespun BWT的性能优于ZLib。如果我使用图像格式png、gif、jpg…,我将不得不编码、传输和解码,我想这太长了。连接在同一台机器上,传输速度如此之快,因此我认为这里的问题是编码/解码的时间。你可能是对的,但是与通过环回套接字获得的数据速度相比,你感兴趣的大小的图像的编码/解码时间是多少?我不确定我理解:你建议编码吗,然后通过套接字传输,或者在磁盘上编码和写入?我绝对不想在磁盘上写,因为这是一种非常肮脏的方式,而且速度太慢。我不建议您更改套接字。顺便说一句,磁盘比套接字慢多少?我不明白你的意思,如果我使用图像格式png、gif、jpg…,我将不得不编码、传输和解码,我想这太长了。连接在同一台机器上,传输速度如此之快,因此我认为这里的问题是编码/解码的时间。你可能是对的,但是与通过环回套接字获得的数据速度相比,你感兴趣的大小的图像的编码/解码时间是多少?我不确定我理解:你建议编码吗,然后通过套接字传输,或者在磁盘上编码和写入?我绝对不想在磁盘上写,因为这是一种非常肮脏的方式,而且速度太慢。我不建议您更改套接字。顺便说一句,磁盘比套接字慢多少?我不明白你的意思,这对结构来说是个好主意,但它似乎不能处理图像。@Matthieu当然可以处理图像,如果图像包含在结构中的字节缓冲区中。是的,我不明白使用它的意义,我可以通过套接字轻松地传输字节缓冲区。我想找的是这个字节缓冲区中的内容。马蒂厄我已经扩展了答案,说明如何将java对象直接传送到C++。这是一个好的结构,但是它好像不能够处理图像。@马蒂厄当然可以处理图像。如果图像包含在结构中的字节缓冲区中,那么我不认为使用它有什么意义,我可以通过套接字轻松地传输字节缓冲区。我要找的是这个字节缓冲区中的内容。@马蒂厄,我已经扩展了答案,说明如何将java对象直接传递给C++。