下面是一个简单的 Java 类,实现了类似于 Windows 自带的截图软件的功能。它允许用户通过按下鼠标左键并拖动来选择屏幕区域,并将选择的区域保存为 PNG 图像文件。

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ScreenshotApp {
    private JFrame frame;
    private Rectangle selection;
    private BufferedImage screenshot;

    public ScreenshotApp() {
        frame = new JFrame();
        frame.setUndecorated(true); // 去除窗口边框
        frame.setBackground(new Color(0, 0, 0, 0)); // 设置窗口背景透明

        // 添加用于选择屏幕区域的组件
        frame.getContentPane().add(new ScreenshotComponent());

        // 注册按键事件监听器,按下Esc键退出程序
        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    System.exit(0);
                }
            }
        });

        // 注册鼠标事件监听器,按下鼠标左键开始选择区域,释放鼠标左键结束选择区域
        frame.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                selection = new Rectangle();
                selection.x = e.getX();
                selection.y = e.getY();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                if (selection != null) {
                    // 保存选择的区域为图像文件
                    try {
                        BufferedImage selectedImage = screenshot.getSubimage(
                                selection.x, selection.y, selection.width, selection.height);
                        ImageIO.write(selectedImage, "png", new File("screenshot.png"));
                        JOptionPane.showMessageDialog(frame, "截图已保存为screenshot.png");
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    } finally {
                        System.exit(0);
                    }
                }
            }
        });

        // 注册鼠标移动事件监听器,根据鼠标位置更新选择区域大小
        frame.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (selection != null) {
                    selection.width = e.getX() - selection.x;
                    selection.height = e.getY() - selection.y;
                    frame.repaint();
                }
            }
        });

        // 获取默认屏幕设备
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        // 获取屏幕尺寸
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setSize(screenSize);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setAlwaysOnTop(true); // 窗口置顶
        frame.setVisible(true);

        try {
            // 捕获屏幕截图
            Robot robot = new Robot();
            screenshot = robot.createScreenCapture(new Rectangle(screenSize));
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }

    class ScreenshotComponent extends JComponent {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawImage(screenshot, 0, 0, this);
            if (selection != null) {
                g2d.setColor(Color.RED);
                g2d.draw(selection);
                g2d.setColor(new Color(255, 0, 0, 40)); // 设置选择区域半透明红色填充
                g2d.fill(selection);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ScreenshotApp());
    }
}

该应用程序创建了一个全屏的无边框窗口,用户可以通过拖动鼠标左键来选择屏幕区域,并将选择的区域保存为'screenshot.png'图像文件。按下Escape键将退出程序。

请确保您已在计算机上安装了Java开发环境(JDK)来编译和运行上述代码。

Java 实现简单截图工具 - 类似 Windows 自带截图功能

原文地址: https://www.cveoy.top/t/topic/bw5k 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录