Java 屏幕捕获应用程序 - 如何?

Posted

技术标签:

【中文标题】Java 屏幕捕获应用程序 - 如何?【英文标题】:Java screen capture App - How to? 【发布时间】:2014-10-23 22:32:57 【问题描述】:

我不是以英语为母语的人,所以首先对语法感到抱歉。

我想做一个应用程序来捕获屏幕的选定区域并保存它。我做了一些研究,我在下面做了代码。

我的问题是:

1 - 我如何在这个应用程序中打开一个 pdf 文件? (我尝试使用一种方法,但没有奏效。我不知道将它放在代码的确切位置)

2 - 如何将选定区域保存在新文件中? (图像文件:JPEG、JPG、png)

3 - [复杂部分] 现在,代码每次只“保存”一个选定区域。我想捕获屏幕的很多部分并将其保存在同一个图像文件中。一个在另一个旁边。我怎样才能做到这一点 ?

Java 代码:

package javaapplication39;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class ScreenCaptureRectangle 

    Rectangle captureRect;

    ScreenCaptureRectangle(final BufferedImage screen) 
        final BufferedImage screenCopy = new BufferedImage(
                screen.getWidth(),
                screen.getHeight(),
                screen.getType());
        final JLabel screenLabel = new JLabel(new ImageIcon(screenCopy));
        JScrollPane screenScroll = new JScrollPane(screenLabel);

        screenScroll.setPreferredSize(new Dimension(
                (int)(screen.getWidth()/3),
                (int)(screen.getHeight()/3)));

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(screenScroll, BorderLayout.CENTER);

        final JLabel selectionLabel = new JLabel(
                "Drag a rectangle in the screen shot!");
        panel.add(selectionLabel, BorderLayout.SOUTH);

        repaint(screen, screenCopy);
        screenLabel.repaint();

        screenLabel.addMouseMotionListener(new MouseMotionAdapter() 

            Point start = new Point();

            @Override
            public void mouseMoved(MouseEvent me) 
                start = me.getPoint();
                repaint(screen, screenCopy);
                selectionLabel.setText("Start Point: " + start);
                screenLabel.repaint();
            

            @Override
            public void mouseDragged(MouseEvent me) 
                Point end = me.getPoint();
                captureRect = new Rectangle(start,
                        new Dimension(end.x-start.x, end.y-start.y));
                repaint(screen, screenCopy);
                screenLabel.repaint();
                selectionLabel.setText("Rectangle: " + captureRect);
            
        );

        JOptionPane.showMessageDialog(null, panel);

        System.out.println("Rectangle of interest: " + captureRect);
    

    public void repaint(BufferedImage orig, BufferedImage copy) 
        Graphics2D g = copy.createGraphics();
        g.drawImage(orig,0,0, null);
        if (captureRect!=null) 
            g.setColor(Color.RED);
            g.draw(captureRect);
            g.setColor(new Color(255,255,255,150));
            g.fill(captureRect);
        
        g.dispose();
    

    public static void main(String[] args) throws Exception 
        Robot robot = new Robot();
        final Dimension screenSize = Toolkit.getDefaultToolkit().
                getScreenSize();
        final BufferedImage screen = robot.createScreenCapture(
                new Rectangle(screenSize));

        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                new ScreenCaptureRectangle(screen);
            
        );
    

【问题讨论】:

【参考方案1】:

1 - 我如何在这个应用程序中打开一个 pdf 文件? (我尝试使用一种方法,但没有奏效。我不知道将它放在代码的确切位置)

看看How to Integrate with the Desktop Class

2 - 如何将选定区域保存在新文件中? (图像文件:JPEG、JPG、png)

看看Writing/Saving an Image

3 - [复杂部分] 现在,代码每次只“保存”一个选定区域。我想捕获屏幕的很多部分并将其保存在同一个图像文件中。一个在另一个旁边。我该怎么做?

正如您所说,这是一个更复杂的问题。您必须修改代码,以便在JOptionPane 中显示panel,而不是在JFrame 中显示它,然后您需要能够监视mouseReleaseEvent 或提供某种操作,可以是工具栏或菜单选项,允许用户保存选择。

查看How to Use Menus、How to Use Buttons, Check Boxes, and Radio Buttons、How to Write an Action Listeners 和How to Use Tool Bars 了解更多详情。

附带说明一下,该代码仅允许您捕获单个屏幕,您可以考虑使用 Drawing a bounding rectangle to select what area to record 之类的东西,它可以让您捕获整个虚拟桌面(多个屏幕)

【讨论】:

谢谢你,疯子。我可以和你一起指望未来的帮助吗? 我经常潜伏 嘿,疯子。我改变了我的计划,我写了一个新的话题。你能帮我看看吗? ***.com/questions/26599834/… 嗨@MadProgrammer,我会最后一次打扰你。我发誓。你为我完成这个应用程序需要多少钱??我怎么付钱给你?谢谢。

以上是关于Java 屏幕捕获应用程序 - 如何?的主要内容,如果未能解决你的问题,请参考以下文章

Java 屏幕捕获 OpenGL 和 DirectX 全屏应用程序

MacOS中某些应用程序的Java屏幕截图

单独线程中的屏幕捕获使 Java 应用程序变慢/无响应

使用 Java 代码在 Android 上捕获屏幕截图 [重复]

如何在 ipad 中禁用屏幕捕获 [重复]

使用鼠标选择要捕获的区域