2010-06-16 61 views
3

我正在研究需要通过网络发送图像的Java程序(最好采用PNG格式,但如果需要,也可以使用其他格式)。当然,这样做的逻辑方式是首先发送PNG图像数据的长度,然后发送数据本身。问题:我在ImageIO或其他任何能够给我图像数据长度的地方看不到任何方法。这是否存在于Java 1.6标准库中的某个地方?在写入数据之前获取BufferedImage的文件大小

我知道我可以将它写入ByteArrayOutputStream并获得结果数组的长度,但在求助之前我想确保我没有遗漏内置的东西。此外,这使得额外的副本图像数据,如果没有必要,我宁愿不这样做。

+3

你在一年前回答:P http://stackoverflow.com/questions/632229/how-to-calculate-java-bufferedimage-filesize/632240#632240 – Lombo 2010-06-16 03:01:24

+0

@Lombo:LOL!太糟糕了,我没有发现,当我正在寻找...我想也许这应该被关闭作为一个副本。 – 2010-06-16 03:27:14

回答

4

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


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

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

你当然也可以用不同的编码来创建你自己的专有网络协议,但如果你使用像HTTP这样的标准协议,它会很容易,因为存在很多API提供的或第三方工具java.net.URLConnectionApache HttpComponents Client,两者都具有内置的支持以块的形式发送数据。

参见:

+0

+1分块的好主意。我没有使用HTTP,只是一个普通的套接字,因为客户端和服务器都是我正在编写的应用程序,我只是想以最少的大惊小怪从一个到另一个获取数据。 (基本上这是一个IPC设置,我只是使用套接字,因为它很快实现)鉴于无处不在的HTTP客户端和服务器库可能我会切换到那一天。 – 2010-06-16 03:34:42

0

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

+0

的确,但是之后需要在浏览器中显示相同的图像数据,而且我认为浏览器对SVG的支持还不错。除此之外,我还不太确定如何将首先生成的图像(使用Java)作为矢量图形。 – 2010-06-16 03:29:14

相关问题