【发布时间】:2014-02-23 12:43:49
【问题描述】:
我是一个 Java 菜鸟,我已经阅读了一些有关套接字的基础知识,我可以使用 ImageIO 通过套接字成功发送图像,但我想减少发送的数据量。最终,我希望以尽可能小的文件大小尽可能快地发送图像(屏幕截图)。
现在,我已经设置了 imageIO;
DataInputStream in=new DataInputStream(client.getInputStream());
DataOutputStream out = new DataOutputStream(client.getOutputStream());
ImageIO.write(captureImg(),"JPG",client.getOutputStream());
接收者:
BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream()));
File outputfile = new File("Screen"+(date.toString())+".jpg");
ImageIO.write(img, "jpg", outputfile);
如果您想知道,这是我用来拍摄图像的方法。
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
我听说过字节数组,您可以在其中发送字节然后在另一端绘制图像。但是我不确定这是否更有效。
任何帮助将不胜感激,请询问您是否希望我为字节数组添加任何额外的信息或代码!
谢谢。
编辑:帕特里克:
ByteArrayOutputStream bScrn = new ByteArrayOutputStream();
ImageIO.write(captureImg(), "JPG", bScrn);
byte imgBytes[] = bScrn.toByteArray();
out.write((Integer.toString(imgBytes.length)).getBytes());
out.write(imgBytes,0,imgBytes.length);
【问题讨论】:
-
嗯.. 目前每个人的尺寸有多大?例如,您对质量有什么要求?使用 jpg 格式已经可以压缩图像大小,但是您是否考虑过通过压缩流来压缩数据?
-
顺便说一句;您的标题不是对问题的解释,而是为了减小图像的大小而不是“发送有效的东西”..
-
现在图像以大约 150kb 的大小进入服务器。正如标题所暗示的那样,我问的原因是,有没有比 imageIO 更好的方法来发送图像?因为我见过类似的 SO 问题,其中有人专门要求不要使用 imageIO,也就是说,不发送图像本身,而是发送数据,然后服务器端程序绘制图像并存储它。就质量而言,它们不必那么好,我没有具体数字。我已经研究过压缩图像本身,但我想我会询问字节数组等。
-
嗯,压缩 JPEG 不会给你带来太多好处,而且会浪费双方的 CPU 时间,我建议不要这样做......
-
谢谢,fge。我会记住这一点。另外,感谢帕特里克的回复!
标签: java image sockets javax.imageio