在java中通过网络压缩和发送图像?

在java中通过网络压缩和发送图像?,java,image,networking,compression,Java,Image,Networking,Compression,我有一个服务器,它等待来自客户端的连接,然后使用Socket类向该客户端发送一个映像 几个客户端将在短时间内连接,所以我想在发送之前压缩图像 图像是1000×1000像素的缓冲图像,我当前发送它们的方式是迭代所有像素并发送该值,然后在另一侧重建它。我怀疑这不是最好的做事方式 有人能就压缩和通过网络发送图像的更好方法给出建议吗 谢谢。我已经很久没有用Java做过任何图像处理了,但是你可以在服务器上以JPEG格式保存图像,然后向他们发送URI,让他们自己检索。我已经很久没有用Java做过任何图像处理

我有一个服务器,它等待来自客户端的连接,然后使用Socket类向该客户端发送一个映像

几个客户端将在短时间内连接,所以我想在发送之前压缩图像

图像是1000×1000像素的缓冲图像,我当前发送它们的方式是迭代所有像素并发送该值,然后在另一侧重建它。我怀疑这不是最好的做事方式

有人能就压缩和通过网络发送图像的更好方法给出建议吗


谢谢。

我已经很久没有用Java做过任何图像处理了,但是你可以在服务器上以JPEG格式保存图像,然后向他们发送URI,让他们自己检索。

我已经很久没有用Java做过任何图像处理了,但是你可以在服务器上以JPEG格式保存图像,然后给他们发送一个URI,让他们自己检索。

JPEG是有损的,因此如果您需要在另一侧使用完全相同的图像,您可以在套接字输出流的顶部使用GZIPOutputStream发送压缩数据,并在另一侧通过套接字输入流顶部的GZIPInputStream接收压缩数据。

JPEG是有损的,因此,如果您在另一端需要完全相同的映像,您可以在套接字的OutputStream上使用GZIPOutputStream发送压缩数据,并在另一端通过套接字的InputStream上的GZIPInputStream接收压缩数据。

如果您在套接字上使用getInputStream和getOutputStream方法,尝试使用java.util.net.gzip输入流和java.util.net.gzip输出流包装流。

如果在套接字上使用getInputStream和getOutputStream方法,尝试用java.util.net.gzip输入流和java.util.net.gzip输出流包装流。

压缩对于课程来说非常重要:哪种方法实际工作得更好取决于图像最初来自何处,以及您的需求是什么(主要是,您是否允许有损压缩,如果允许,您对其施加了什么约束)

开始时,尝试使用ImageIO.write()将JPEG或PNG格式的图像写入ByteArrayOutputStream,然后可以将其生成的字节数组发送到套接字[1]。如果这样可以得到可接受的结果,那么优点是几乎不需要开发时间

如果它们不能提供可接受的结果(因为您不能使用有损压缩,或者因为PNG压缩不能提供可接受的压缩比),然后你可能必须想出一些定制的方法来适应你的数据;在那一点上。只有你在一天结束时才知道你的数据,但是一种通用的技术是尝试将你的数据转换成一种可以与平减指数或其他标准算法很好地工作的形式。例如,使用平减指数,你可以对数据进行转换/重新排序,以便重复类似字节的重复模式和运行可能会彼此接近。这可能意味着发送所有像素的顶部位,然后是所有下一个顶部位,等等,如果它们实际上只是噪声,那么实际上不发送每个组件的底部几位

不过,希望JPEG/PNG选项能为您提供所需的结果,您就不必再担心了


[1]抱歉,应该说——如果不需要首先查询图像数据的长度,就可以将套接字输出流设置为图像数据写入的输出流,并使用哈希代码……

压缩在很大程度上取决于课程:哪种方法实际工作得更好取决于图像最初来自何处,以及图像的内容需求是(主要是,您是否允许有损压缩,如果允许,您对其施加了什么约束)

开始时,尝试使用ImageIO.write()将JPEG或PNG格式的图像写入ByteArrayOutputStream,然后可以将其生成的字节数组发送到套接字[1]。如果这样可以得到可接受的结果,那么优点是几乎不需要开发时间

如果它们不能提供可接受的结果(因为您不能使用有损压缩,或者因为PNG压缩不能提供可接受的压缩比),然后你可能必须想出一些定制的方法来适应你的数据;在那一点上。只有你在一天结束时才知道你的数据,但是一种通用的技术是尝试将你的数据转换成一种可以与平减指数或其他标准算法很好地工作的形式。例如,使用平减指数,你可以对数据进行转换/重新排序,以便重复类似字节的重复模式和运行可能会彼此接近。这可能意味着发送所有像素的顶部位,然后是所有下一个顶部位,等等,如果它们实际上只是噪声,那么实际上不发送每个组件的底部几位

不过,希望JPEG/PNG选项能为您提供所需的结果,您就不必再担心了

[1] 抱歉,应该这么说——很明显,您可以将套接字输出流设置为写入图像数据的流,如果您不需要首先查询它的长度,请使用哈希代码