前言
查看了相关文章然后一笔一笔打代码再调试成功出结果,
eguid的博客
不保证代码能够原封不动就能运行,
这里做一下记录。
ps:代码内容有改动,原版的可以看原作者的。
代码
package net.w2p.JCVStudio.zhiboStudy;
import org.bytedeco.javacv.CanvasFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.*;
import java.awt.image.BufferedImage;
/***
* https://blog.csdn.net/eguid_1/article/details/64922443
* java原生实现屏幕设备遍历和屏幕采集(捕获)等功能
* **/
public class Lesson07 {
Logger logger= LoggerFactory.getLogger("Lesson07");
public void captureScreen(){
//--获取屏幕大小
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//指定捕获的屏幕区域大小。这里使用全屏捕获。
Rectangle rectangle=new Rectangle(screenSize);
//--获取本地环境
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs=ge.getScreenDevices();
logger.info("找到了{}个屏幕设备。",gs.length);
Robot robot=null;
int ret=-1;
for(int index=0;index<10;index++){
GraphicsDevice g=gs[index];
try{
robot=new Robot(g);
BufferedImage img=robot.createScreenCapture(rectangle);
if(img!=null&&img.getWidth()>1){
ret=index;
break;
}
}
catch (Exception ed){
ed.printStackTrace();
logger.info("打开第{}个屏幕设备时候失败,尝试打开第{}个的",index,index+1);
}
}
if(ret==-1){
logger.info("抱歉,找不到可用屏幕设备。");
return;
}
logger.info("可用屏幕设备序号为:{}",ret);
CanvasFrame frame=new CanvasFrame("屏幕录制测试");
int width=800,height=600;
frame.setBounds((int)(screenSize.getWidth()-width)/2,(int)(screenSize.getHeight()-height)/2
,width,height
);
frame.setCanvasSize(width,height);
while (frame.isShowing()){
// 从当前屏幕中读取的像素图像,该图像不包括鼠标光标
logger.info("开始录制");
BufferedImage image=robot.createScreenCapture(rectangle);
frame.showImage(image);
try{
Thread.sleep(45);
}
catch (Exception ed){
ed.printStackTrace();
}
}
frame.dispose();
}
public static void main(String[] args) throws Exception{
Lesson07 test=new Lesson07();
test.captureScreen();
}
}