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

标签 java image networking compression

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

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

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

谁能就压缩和通过网络发送图像的更好方法提供任何建议?

谢谢。

最佳答案

压缩对于类(class)来说非常重要:哪种方法实际上效果更好取决于您的图像最初来自何处,以及您的要求是什么(主要是,您是否允许有损压缩,如果允许,您的限制是什么放在上面)。

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

如果它们没有给出可接受的结果(要么是因为您不能使用有损压缩,要么是因为 PNG 压缩没有提供可接受的压缩率),那么您可能必须想出一些适合您的数据的自定义方法;在那时候。在一天结束时只有您知道您的数据,但一般的技术是尝试将您的数据转化为可以与 Deflater 或其他一些标准算法一起很好地工作的形式。因此,例如,使用压缩器,您可以转换/重新排序数据,以便重复模式和类似字节的运行很可能彼此靠近。这可能意味着发送像素的所有高位,然后是所有次高位,等等,如果它们实际上只是噪声,则实际上不发送每个组件的低位。

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

[1] 抱歉,应该说——如果您不需要首先查询它的长度,您显然可以使套接字输出流成为图像数据写入的输出流,获取哈希码...

关于java - 在java中通过网络压缩和发送图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787644/

相关文章:

javascript - 弹出jsp java.lang.NumberFormatException : null

asp.net - 在 MySQL 中存储图片 - 聪明吗?

objective-c - 我想点击时切换按钮图像

wcf - 什么时候适合在 webclient 或 httpwebrequest 上使用 WCF?

java - Dagger-2 的空指针异常(android)

java - Swagger 启动 tomcat 时抛出 UncheckedExecutionException

java - 在 Java 中使用 jshout 将缓冲流发送到 Icecast 服务器

android - 缓存位图 - Android

ios - 从 OS X 向 iOS 发送通知

android - 使用 Retrofit 批量请求