Select, Copy and Paste Images

前端 未结 2 955
南笙
南笙 2020-12-20 06:18

What I want my app to do:

1 - Select an area of Image and get the coordinates. This code below should do this:

import java.awt.*;
import java.awt.eve         


        
2条回答
  •  清歌不尽
    2020-12-20 06:55

    You need more listeners for button pressed and released.. some lines in the mouseMoved also better placed in mousePressed.
    You would want to update your captureRect when you release the mouse (in mouseReleased method).
    Then you just write it to the file. You may adjust other things according to your needs.

    And for clarity maybe it's better to add a save button into your UI.

    public class ScreenCaptureRectangle {
    
        Rectangle captureRect;
        Point start = new Point();
        SimpleDateFormat sdf;
    
        ScreenCaptureRectangle(final BufferedImage screen) {
            sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
            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);
            JButton btnSave = new JButton("SAVE");
            btnSave.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent ae) {
                    double w = captureRect.getWidth();
                    double h = captureRect.getHeight();
                    double x = captureRect.getX();
                    double y = captureRect.getY();
    
                    int W = (int) w;
                    int H = (int) h;
                    int X = (int) x;
                    int Y = (int) y;
    
                    BufferedImage selectImg = screen.getSubimage(X, Y, W, H);
                    try {
                        String fName = generateFileName();
                        if (fName != null) {
                            File f = new File(fName);
                            if (f.createNewFile()) {
                                ImageIO.write(selectImg, "jpg", f);
                            }
                        }
                    } catch (IOException ex) {
                        Logger.getLogger(ScreenCaptureRectangle.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
            panel.add(btnSave, BorderLayout.AFTER_LAST_LINE);
    
            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() {
    
                @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);
                }
    
            });
    
            screenLabel.addMouseListener(new MouseAdapter() {
    
                @Override
                public void mousePressed(MouseEvent me) {
                    start = me.getPoint();
                    repaint(screen, screenCopy);
                    selectionLabel.setText("Start Point: " + start);
                    screenLabel.repaint();
                }
    
                @Override
                public void mouseReleased(MouseEvent me) {
                    int endX = me.getX();
                    int endY = me.getY();
                    if (endX > start.x && endY > start.y) {
                        captureRect = new Rectangle(start.x, start.y, endX-start.x, endY-start.y);
                        System.out.println("Rectangle of interest: " + captureRect);
                    }
                }
    
            });
    
            JOptionPane.showMessageDialog(null, panel);
        }
    
        private String generateFileName() {
            return new StringBuilder("screencrop_").append(sdf.format(new Date())).append(".jpg").toString();
        }
    
        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);
                }
            });
        }
    }
    

提交回复
热议问题