javaFx屏幕截图工具

完成主舞台布局并绑定主舞台按钮事件
public class CapterScreen extends Application {

    ImageView iv; //切成的图片展示区域
    Stage primaryStage; //主舞台
    Stage stage;        //切图时候的辅助舞台
    double start_x;     //切图区域的起始位置x
    double start_y;     //切图区域的起始位置y
    double w;           //切图区域宽
    double h;           //切图区域高
    HBox hBox;          //切图区域

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;  //主舞台全局赋值
        AnchorPane root = new AnchorPane(); //锚点布局,也称为 绝对布局,定位布局
        //创建截屏按钮与显示区域并且进行布局
        Button bu = new Button("点击截屏");
        iv= new ImageView();
        iv.setFitHeight(400);
        iv.setPreserveRatio(true); //开启等比例缩放
        root.getChildren().addAll(bu,iv);
        AnchorPane.setTopAnchor(bu,50.0);
        AnchorPane.setLeftAnchor(bu,50.0);
        AnchorPane.setTopAnchor(iv,100.0);
        AnchorPane.setLeftAnchor(iv,50.0);

        //设置场景和标题,以及舞台大小
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setTitle("截屏工具");
        primaryStage.setHeight(800);
        primaryStage.setWidth(800);
        primaryStage.show();
        //为点击截图按钮绑定事件
        bu.setOnAction(event -> {
            show();
        });
        //绑定截图快捷键,使用快捷键达到点击按钮的目的
        KeyCombination keyCombination = KeyCombination.valueOf("ctrl+alt+p");
        Mnemonic mc = new Mnemonic(bu,keyCombination);
        scene.addMnemonic(mc);
    }
    public static void main(String[] args) {
        Application.launch(args);
    }
}

在这里插入图片描述

显示截图操作舞台并绑定鼠标截图事件
public void show(){
        //将主舞台缩放到任务栏
        primaryStage.setIconified(true);
        //创建辅助舞台,并设置场景与布局
        stage = new Stage();
        //锚点布局采用半透明
        AnchorPane anchorPane = new AnchorPane();
        anchorPane.setStyle("-fx-background-color: #85858522");
        //场景设置白色全透明
        Scene scene = new Scene(anchorPane);
        scene.setFill(Paint.valueOf("#ffffff00"));
        stage.setScene(scene);
        //清楚全屏中间提示文字
        stage.setFullScreenExitHint("");
        stage.initStyle(StageStyle.TRANSPARENT);
        stage.setFullScreen(true);
        stage.show();

        //切图窗口绑定鼠标按下事件
        anchorPane.setOnMousePressed(event -> {
            //清除锚点布局中所有子元素
            anchorPane.getChildren().clear();
            //创建切图区域
            hBox = new HBox();
            //设置背景保证能看到切图区域桌面
            hBox.setBackground(null);
            //设置边框
            hBox.setBorder(new Border(new BorderStroke(Paint.valueOf("#c03700"), BorderStrokeStyle.SOLID,
                    null,new BorderWidths(3))));
            anchorPane.getChildren().add(hBox);
            //记录并设置起始位置
            start_x = event.getSceneX();
            start_y = event.getSceneY();
            AnchorPane.setLeftAnchor(hBox,start_x);
            AnchorPane.setTopAnchor(hBox,start_y);
        });
        //绑定鼠标按下拖拽的事件
        anchorPane.setOnMouseDragged(event -> {
            //用label记录切图区域的长宽
            Label label = new Label();
            label.setAlignment(Pos.CENTER);
            label.setPrefHeight(30);
            label.setPrefWidth(170);
            anchorPane.getChildren().add(label);
            AnchorPane.setLeftAnchor(label,start_x+30);
            AnchorPane.setTopAnchor(label,start_y);
            label.setTextFill(Paint.valueOf("#ffffff"));//白色填充
            label.setStyle("-fx-background-color: #000000");//黑背景
            //计算宽高并且完成切图区域的动态效果
            w = Math.abs(event.getSceneX()-start_x);
            h = Math.abs(event.getSceneY()-start_y);
            hBox.setPrefWidth(w);
            hBox.setPrefHeight(h);
            label.setText("宽:"+w+" 高:"+h);
        });

        //绑定鼠标松开事件
        anchorPane.setOnMouseReleased(event -> {
            //记录最终长宽
            w = Math.abs(event.getSceneX()-start_x);
            h = Math.abs(event.getSceneY()-start_y);
            anchorPane.setStyle("-fx-background-color: #00000000");
            //添加剪切按钮,并显示在切图区域的底部
            Button b = new Button("剪切");
            hBox.setBorder(new Border(new BorderStroke(Paint.valueOf("#85858544"), BorderStrokeStyle.SOLID,
                    null,new BorderWidths(3))));
            hBox.getChildren().add(b);
            hBox.setAlignment(Pos.BOTTOM_RIGHT);
            //为切图按钮绑定切图事件
            b.setOnAction(event1 -> {
                //切图辅助舞台小时
                stage.close();
                try {
                    //切图具体方法
                    capterImg();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //主舞台还原
                primaryStage.setIconified(false);
            });
        });

        scene.setOnKeyPressed(event -> {
            if(event.getCode() == KeyCode.ESCAPE){
                stage.close();
                primaryStage.setIconified(false);
            }
        });
    }
处理截屏与图像的保存
 public void capterImg() throws Exception {
        //利用awt中的方法,通过记录的起始点和长宽完成屏幕截图
        Robot robot = new Robot();
        Rectangle re = new Rectangle((int)start_x,(int)start_y,(int)w,(int)h);
        BufferedImage screenCapture = robot.createScreenCapture(re);
        //截图图片背景透明处理
        //BufferedImage bufferedImage = Picture4.transferAlpha(screenCapture);
        //不进行背景透明处理
        BufferedImage bufferedImage = screenCapture;
        //转换图片格式展示在主舞台的场景中
        WritableImage writableImage = SwingFXUtils.toFXImage(bufferedImage, null);
        iv.setImage(writableImage);

        //将截图内容,放入系统剪切板
        Clipboard cb = Clipboard.getSystemClipboard();
        ClipboardContent content = new ClipboardContent();
        content.putImage(writableImage);
        cb.setContent(content);

        //将截取图片放入到系统固定位置
        ImageIO.write(bufferedImage,"png",new File("E:/capter.png"));

    }
背景透明处理
public static BufferedImage transferAlpha(BufferedImage img) {
		BufferedImage bufferedImage = null;
		try {
			//取左上角点作为背景点
			int RGB = img.getRGB(img.getMinX(),img.getMinY());
			int R = (RGB & 0xff0000) >>16;
			int G= (RGB & 0xff00) >> 8;
			int B = (RGB & 0xff);
			bufferedImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
			for (int j1 = img.getMinY(); j1 < img.getHeight(); j1++) {
				//遍历一行中的rgb三通道像素点,
				for (int j2 = img.getMinX(); j2 < img.getWidth(); j2++) {
					//获取固定点的rgb值
					int rgb = img.getRGB(j2, j1);
					int r =(rgb & 0xff0000 ) >> 16 ;
					int g= (rgb & 0xff00 ) >> 8 ;
					int b= (rgb & 0xff );
					if((Math.abs(r-R)<15) && (Math.abs(g-G)<15) && (Math.abs(b-B)<15)){
						rgb = (1 << 24) | (rgb & 0x00ffffff);
					}
					//设置固定点的rgb值
					bufferedImage.setRGB(j2, j1, rgb);
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{

		}
		return bufferedImage;
	}
整体效果展示

在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Java可以使用AWT (Abstract Window Toolkit) 或 JavaFX形库来实现录屏工具。 下面是一种基于AWT的简单实现方法: 1. 使用Robot类获取屏幕: ``` Robot robot = new Robot(); BufferedImage screenShot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); ``` 2. 使用ImageIO类将保存为视频帧: ``` File file = new File("screenShot.png"); ImageIO.write(screenShot, "png", file); ``` 3. 使用Java视频编码器(例如Xuggler)将多个视频帧编码为视频文件。 有很多其他方法可以实现录屏,这只是其中的一种简单实现。如果您希望获得更多详细的信息,可以查看关于Java形编程的相关书籍或在线资源。 ### 回答2: 要实现Java的录屏工具,可以使用Java的AWT和Robot类来捕获屏幕上的像,并使用Java提供的一些形库或框架来保存和处理这些像。 首先,我们需要创建一个Java应用程序,在此应用程序中创建一个AWT窗口来显示录屏的实时内容。可以使用`javax.swing.JFrame`类来创建一个窗口,并使用`java.awt.event.WindowAdapter`类来监听窗口的关闭事件。 接下来,使用Java的`java.awt.Robot`类来捕获屏幕像。可以使用`Robot`类的`createScreenCapture`方法来获取屏幕上的像,并将像保存为`BufferedImage`对象。 然后,可以使用Java提供的形库,如`javax.imageio.ImageIO`类,将`BufferedImage`对象保存为像文件,如PNG或JPEG格式。可以使用`ImageIO.write`方法将像保存为文件。 为了实现实时录屏,可以使用一个循环来持续捕获和保存屏幕像。可以使用`Robot`类的`delay`方法来设置捕获像的时间间隔。 最后,可以添加一些额外的功能,如添加鼠标光标的显示、添加录音功能等来完善录屏工具。 总结起来,要实现Java的录屏工具,需要使用AWT和Robot类来捕获屏幕像,使用形库保存像,利用WindowsAdapter类监听窗口关闭事件,以及添加额外的功能来提升录屏工具的实用性。 ### 回答3: 要实现Java的录屏工具,可以使用Java提供的一些库和功能来捕捉屏幕内容,并将其保存为视频文件。下面是一种实现录屏工具的简单方法: 1. 首先,通过使用Java中的Robot类,可以捕捉屏幕上的像。使用Robot类的createScreenCapture方法可以捕捉到屏幕上的某一帧像。 2. 接下来,需要使用Java提供的视频编码功能,将捕获到的一连串像进行编码,并将其保存为视频文件。可以使用Xuggler或JavaCV等库来进行视频编码和保存。这些库提供了许多功能和方法用于处理和保存视频文件。 3. 在将像编码为视频之前,可以使用Java提供的像处理功能对捕获到的像进行处理。例如,可以进行像的缩放、裁剪或添加水印等操作。 4. 将像序列编码为视频时,可以为视频指定编码器、帧率、分辨率等参数,以及选择所需的视频格式。这些参数需要根据具体需求进行设置。 5. 最后,将编码后的视频帧写入到视频文件中,保存起来。 需要注意的是,Java并不是最理想的语言来实现高性能的录屏工具,因为它的像处理和视频编码性能相对较低。如果需要更高效的录屏工具,可以考虑使用其他语言或框架来实现。另外,还需注意屏幕捕捉和视频编码可能会涉及到操作系统相关的API调用,因此在跨平台开发时需要进行兼容性测试和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值