Как сделать снимок экрана с изображением, нарисовать его на компоненте графического интерфейса и нарисовать прямоугольники в определенных областях? - PullRequest
0 голосов
/ 16 декабря 2011

Я делаю снимки экрана моего экрана, используя следующий пример:

try {
   Robot robot = new Robot();
   BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, 200, 200));
} catch java.awt.AWTException exc) {
    System.out.println("error: main");
}

Теперь я хочу нарисовать снимки экрана на компоненте графического интерфейса. Я не знаю, какой компонент мне следует использовать, но я хочу рисовать изображения каждый кадр (желательно ~ 20 кадров в секунду), чтобы он выглядел как фильм, камера, снимающая мой рабочий стол. И я хочу нарисовать рамки над определенными областями нарисованной области.

Как я мог это сделать? Каждый пример, который мне показывали, делал следующее:

  • Изображение загружается из файловой системы при запуске программы и тянет к JPanel, поэтому я не смог бы так легко рисовать хочу сделать это.

Это не работает (серая панель):

visualization = new JPanel();
visualization.setLayout(new BorderLayout());
try {
        Robot robot = new Robot();
        BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, 200, 200));
        Graphics2D g = image.createGraphics();
        visualization.paint(g);
        visualization.setVisible(true);

    }
    catch(java.awt.AWTException exc) {
        System.out.println("error: main");
    }

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

лучший способ, насколько я знаю, это поместить изображение как Значок в JLabel , простой пример

import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;

public class CaptureScreen implements ActionListener {

    private JFrame f = new JFrame("Screen Capture");
    private JPanel pane = new JPanel();
    private JButton capture = new JButton("Capture");
    private JDialog d = new JDialog();
    private JScrollPane scrollPane = new JScrollPane();
    private JLabel l = new JLabel();
    private Point location;

    public CaptureScreen() {
        capture.setActionCommand("CaptureScreen");
        capture.setFocusPainted(false);
        capture.addActionListener(this);
        capture.setPreferredSize(new Dimension(300, 50));
        pane.add(capture);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(pane);
        f.setLocation(100, 100);
        f.pack();
        f.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createPicContainer();
            }
        });
    }

    private void createPicContainer() {
        l.setPreferredSize(new Dimension(700, 500));
        scrollPane = new JScrollPane(l,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setBackground(Color.white);
        scrollPane.getViewport().setBackground(Color.white);
        d.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        d.add(scrollPane);
        d.pack();
        d.setVisible(false);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("CaptureScreen")) {
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // gets the screen size
            Robot r;
            BufferedImage bI;
            try {
                r = new Robot(); // creates robot not sure exactly how it works
                Thread.sleep(1000); // waits 1 second before capture
                bI = r.createScreenCapture(new Rectangle(d)); // tells robot to capture the screen
                showPic(bI);
                saveImage(bI);
            } catch (AWTException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e2) {
                e2.printStackTrace();
            }
        }
    }

    private void saveImage(BufferedImage bI) {
        try {
            ImageIO.write(bI, "JPG", new File("screenShot.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void showPic(BufferedImage bI) {
        ImageIcon pic = new ImageIcon(bI);
        l.setIcon(pic);
        l.revalidate();
        l.repaint();
        d.setVisible(false);
        location = f.getLocationOnScreen();
        int x = location.x;
        int y = location.y;
        d.setLocation(x, y + f.getHeight());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                d.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                CaptureScreen cs = new CaptureScreen();
            }
        });
    }
}
1 голос
/ 16 декабря 2011

Я также предлагаю способ, упомянутый mKorbel, кстати, если вы действительно хотите, как вы сказали, это рабочий код ..

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImagePane extends JPanel{

    private BufferedImage image;

    public ImagePane()  {


            try {
               Robot robot = new Robot();
                 image = robot.createScreenCapture(new Rectangle(0, 0, 500, 500));
            } catch (AWTException ex) {
                Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex);
            }

    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null); 

    }
public static void main(String[] args) {

        JFrame test = new JFrame();

            test.add(new ImagePane());
            Dimension b = new Dimension(500,500);
            test.setMinimumSize(b);

        test.setVisible(true);

    }
}
1 голос
/ 16 декабря 2011

Как я мог это сделать? Каждый пример, который мне показывали, выполнялся следующим образом: изображение загружается из файловой системы при запуске программы и отрисовывается в JPanel, поэтому невозможно нарисовать его так легко, как я хочу.

Это путь. Расширьте JPanel и переопределите paintComponent, добавьте слушателей мыши для пользовательского рисования и сделайте рисование поверх вашего BufferdImage в методе paintComponent.

UPDATE

Если вы не знаете, как продлить и JPanel и реализовать paintComponent, см. Мой ответ на Как нарисовать JPanel в виде кнопки Nimbus J?

...