java – 使用ImageIO发送图像流?
我有一个ServerSocket和一个Socket设置,所以ServerSocket使用ImageIO.write(….)发送图像流,Socket尝试读取它们并用它们更新JFrame.所以我想知道ImageIO是否可以检测到图像的结束. (我完全不了解JPEG格式,所以我测试了它) 显然不是. 在服务器端,我通过循环使用ImageIO.write(…)连续发送图像,其间有一些睡眠.在客户端,ImageIO读取第一个图像没问题,但在下一个图像上它返回null.这令人困惑.我期待它要么阻止阅读第一张图像(因为它认为下一张图像仍然是同一张图像的一部分),要么成功阅读所有这些图像(因为它有效).到底是怎么回事?它看起来像ImageIO检测到第一个图像的结束,但不是第二个图像的结束. (顺便说一下,这些图像大致相似)是否有一种简单的方法可以像这样流式传输图像,或者我是否必须创建自己的机制,将字节读入缓冲区,直到达到指定的字节或序列为止字节,此时它从缓冲区读取图像? 这是我的服务器代码的有用部分:
我的客户代码:
最佳答案
ImageIO.read(InputStream)创建一个ImageInputStream并在内部调用read(ImageInputStream).记录后一种方法,以便在读取图像时关闭流.
因此,理论上,您可以只获取ImageReader,自己创建一个ImageInputStream,并重复从ImageInputStream中读取ImageReader. 除此之外,看起来ImageInputStream设计用于处理一个且仅一个图像(可能包含或不包含多个帧).如果多次调用ImageReader.read(0),它将每次回退到(缓存的)流数据的开头,一遍又一遍地为您提供相同的图像. ImageReader.read(1)将在多帧图像中寻找第二帧,这当然对JPEG没有意义. 所以,也许我们可以创建一个ImageInputStream,让ImageReader从中读取,然后创建一个新的ImageInputStream来处理流中的后续图像数据,对吧?除此之外,看起来ImageInputStream会执行各种缓存,预读和后推,这使得很难知道包装的InputStream的读取位置.下一个ImageInputStream将开始从某个地方读取数据,但它并不像我们预期的那样位于第一个图像数据的末尾. 确定基础流的位置的唯一方法是使用标记和重置.由于图像可能很大,因此您可能需要BufferedInputStream来允许大型readLimit. 这对我有用: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |