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

时间:2009-04-24 21:30:20

标签: java image networking compression

我有一台等待客户端连接的服务器,然后使用Socket类将图像发送到该客户端。

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

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

任何人都可以提供有关压缩的建议以及通过网络发送图像的更好方法吗?

感谢。

4 个答案:

答案 0 :(得分:4)

压缩对于课程非常重要:哪种方法实际上会更好地工作取决于你的图像来自哪里,以及你的要求是什么(主要是,你是否允许有损压缩,如果是,你有什么限制你放在它上面。)

要开始使用,尝试使用ImageIO.write()将图像以JPEG或PNG格式写入ByteArrayOutputStream ,然后可以将其生成的字节数组发送到套接字[1]。如果这给你一个可接受的结果,那么优点是它将涉及下一个没有开发时间。

如果他们没有给出可接受的结果(因为你不能使用有损压缩或因为PNG压缩不能提供可接受的压缩率),那么你可能需要提供一些自定义的东西来满足你的数据;在那时候。只有您在一天结束时才能知道您的数据,但一般的技术是尝试将数据转换为适用于Deflater或其他标准算法的表单。因此,例如,使用deflater,您可以转换/重新排序数据,以便重复模式和类似字节的运行可能彼此接近。这可能意味着发送所有顶部像素,然后发送所有下一个顶部位等,如果它们实际上只是噪声,实际上不会发送每个组件的最后几位。

希望JPEG / PNG选项可以为您提供所需的结果,而且您​​不必再担心了。

[1]对不起,应该说 - 如果你不需要首先查询它的长度,你可以明显地使套接字输出流成为图像数据写入的那个,取一个哈希码......

答案 1 :(得分:3)

JPEG是有损的,所以如果你需要另一面完全相同的图像,你可以在套接字的OutputStream顶部使用GZIPOutputStream来发送压缩数据,并在另一端通过GZIPInputStream接收它。套接字的InputStream。

答案 2 :(得分:0)

自从我用Java进行任何图像处理已经有很长一段时间了,但您可以将图像作为JPEG保存在服务器上,然后向它们发送一个URI并让它们自己检索它。

答案 3 :(得分:0)

如果您在Socket上使用getInputStream和getOutputStream方法,请尝试使用java.util.net.GZIPInputStream和java.util.net.GZIPOutputStream包装流。