在写入数据之前获取BufferedImage的文件大小

3
我正在开发一个Java程序,需要在网络上发送一张图片(最好是PNG格式的,如果必要也可以使用其他格式)。逻辑上,首先需要发送PNG图像数据的长度,然后再发送数据本身。问题是:我没有在ImageIO或其他地方找到能够给出图像数据长度的方法。Java 1.6标准库中是否存在这种方法?
我知道我可以将其写入ByteArrayOutputStream并获取结果数组的长度,但在诉诸此方法之前,我想确保自己没有漏看已有的内置方法。此外,这会使图像数据额外复制一次,如果不必要的话,我宁愿避免这种情况。

3
你一年前已经回答过自己啦 :P https://dev59.com/dHRB5IYBdhLWcg3wa2m2#632240 - Lombo
@Lombo:哈哈!太遗憾了,我在搜索时没有找到这个...我认为这可能应该被关闭为重复。 - David Z
2个回答

4

由于最终内容长度事先无法准确预测,因此此信息不可用。您需要先生成整个图像。


另一方面,您使用的是哪种网络协议?您可能要检查所涉及的协议是否支持以块形式发送数据。

以HTTP为例,您可以使用 Transfer-Encoding: chunked 来实现。使用这种方法,您可以利用一个 byte[] 缓冲区来发送块。基本上,首先发送一个标头,表示块长度,然后发送一个 CRLF,然后是整个块,然后是两个 CRLF,如此往复直到流结束,然后发送一个长度为 0 的块头。

当然,您也可以发明自己的专有网络协议,其中包含不同的编码方式,但如果您使用标准协议(如 HTTP),则非常容易,因为存在许多 API 提供的或第三方工具,例如 java.net.URLConnectionApache HttpComponents Client,它们都内置了对块数据的支持。

另请参阅:


+1 块处理的想法不错。不过我没有使用HTTP,只是使用了一个普通的套接字,因为客户端和服务器都是我编写的应用程序,我只想以最少的麻烦将数据从一个传输到另一个。 (基本上这是一个IPC设置,我只是使用套接字因为它很快实现)。考虑到HTTP客户端和服务器库的普及性,也许有一天我会转换到那个。 - David Z

0

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


确实如此,但是这些图像数据需要在浏览器中显示,我认为浏览器对SVG的支持还不够好。此外,我也不确定如何首先将Java生成的图像作为矢量图形呈现。 - David Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接