【问题标题】:Get file size of BufferedImage before writing the data在写入数据之前获取 BufferedImage 的文件大小
【发布时间】:2023-04-02 21:10:02
【问题描述】:

我正在开发一个 Java 程序,该程序需要通过网络发送图像(最好是 PNG 格式,但如果需要我可以使用其他格式)。当然,这样做的逻辑方法是首先发送 PNG 图像数据的长度,然后是数据本身。问题:我在ImageIO 或其他任何地方都没有看到任何可以给我图像数据长度的方法。这在 Java 1.6 标准库中是否存在?

我知道我可以把它写到 ByteArrayOutputStream 并得到结果数组的长度,但在诉诸之前,我想确保我没有遗漏内置的东西。此外,这会产生额外的副本图像数据,如果没有必要我宁愿不这样做。

【问题讨论】:

标签: java image


【解决方案1】:

此信息不可用,因为最终的内容长度无法事先完全预测。您需要先生成整个图像。


另一方面,您使用的是什么网络协议?您可能需要检查相关协议是否支持在 chunks 中发送数据。

以HTTP为例,你可以使用Transfer-Encoding:chunked。有了这个,您可以使用byte[] 缓冲区来发送块。基本上,首先发送一个表示块长度的块头,然后是一个 CRLF,然后是整个块,然后是两个 CRLF,依此类推,直到流结束,然后发送一个长度为 0 的块头。

您当然也可以使用不同的编码发明自己的专有网络协议,但如果您使用像 HTTP 这样的标准协议,这毕竟会很容易,因为存在很多 API 提供的或 3rd 方工具,如 @ 987654323@ 和 Apache HttpComponents Client,它们都内置了对分块发送数据的支持。

另见

【讨论】:

  • +1 分块的好主意。不过,我没有使用 HTTP,只是一个普通的套接字,因为客户端和服务器都是我正在编写的应用程序,我只是想以最少的麻烦从一个到另一个获取数据。 (基本上这是一个 IPC 设置,我只是使用一个套接字,因为它实现起来很快)鉴于 HTTP 客户端和服务器库无处不在,也许有一天我会切换到那个。
【解决方案2】:

当然,如果您使用 SVG,这将非常简单。

【讨论】:

  • 确实如此,但是稍后需要在浏览器中显示相同的图像数据,而且我认为浏览器对 SVG 的支持还没有那么好。此外,我不太确定如何将图像(在 Java 中)生成为矢量图形。
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多