Robot robot = new Robot(); //要捕捉的屏幕显示范围,下面以全屏示例说明 Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); BufferedImage bm = robot.createScreenCapture(rect);
通过上面几行代码就把屏幕的当前显示内容保存为内存中的BufferedImage对象,这个确实简单.
//outputstream就是要写入处理后的jpg图片的输出流,要保存到文件的话就用FileOutputStream JPEGCodec.createJPEGEncoder(outputstream).encode(bm); ImageIO.write(bm, "jpg", outputstream);
这两种方法有什么差别呢?别的我不知道,就平均效率来说,第二种是第一种的2倍,我实验中转换了10次,使用的时间分别是125和250(单位是百分之一毫秒,机子有点慢的说).
ByteArrayOutputStream bos = new ByteArrayOutputStream(); JPEGCodec.createJPEGEncoder(bos).encode(bm); // 上句也可以用 ImageIO.write(bm, "jpg", bos)实现 bos.flush(); byte[] data = bos.toByteArray();
将生成的字节数组进行zip压缩
ZipOutputStream zos = new ZipOutputStream(bos); zos.setLevel(Deflater.BEST_COMPRESSION); //下面我以ScreenCapture.jpg说明 zos.putNextEntry(new ZipEntry("ScreenCapture.jpg")); zos.write(data); zos.closeEntry();
好了,这个时候就可以把字节数组发往监控机器了,如果你发了,你就知道,问题又来了(不会吧!)。
DataOutputStream dos = new DataOutputStream(client.getOutputStream()); //SEND_IMAGE_SYMBOL是一个标识位,你随便定义,只要保证能与其它标识位区分就行 dos.write(SEND_IMAGE_SYMBOL); dos.writeInt(data.length); dos.write(data); dos.flush();
啊,真不容易,终于发送出去了!不知道那边接收到了没有?那现在就去追踪报道吧。
//先要判断消息的类型 DataInputStream reader = new DataInputStream(socket.getInputStream()); int msgSymbol = reader.read(); //还记得这个SEND_IMAGE_SYMBOL吗 if (msgSymbol == SEND_IMAGE_SYMBOL) { //哦,是要发送图片啊。让我看看你的图片有多大 int msgSize = reader.readInt(); //晕,你网速好也不用发这么大吧,我一次接收不完的,不过幸好我有准备 byte[] buffer = newbyte[msgSize]; int length = 0; while (length < msgSize) { int readSize = reader.read(buffer, length, msgSize - length); if (readSize > 0) { length = length + readSize; } else{ break; } } //这是非常关键的,图片太大时一次性是读不完的,一定要使用缓冲重复读取。 //人家给我发送的消息是图片,怎么把字节数组还原成图片呢? ByteArrayInputStream bis = new ByteArrayInputStream(buffer); ZipInputStream zis = new ZipInputStream(bis); //读取压缩的数据内容。 ZipEntry ze = zis.getNextEntry(); BufferedImage bi = ImageIO.read(zis); //或者BufferedImage bi = JPEGCodec.createJPEGDecoder(zis).decodeAsBufferedImage(); //上面两行代码的差别已经说过了 //另外,如果在发送的时候你没有进行压缩,把上面的zis换成bis就行。 //有了BufferedImage对象,剩下的就是把它显示出来了进行远程"偷窥",任何一个支持图片显示的swing组件你都以用,我在实验中用的是JPanel,一个简单又支持双缓冲的组件。 }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221416.html原文链接:https://javaforall.net
