Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Java] Problema con selezione rettangolo

    salve!
    ho un piccolo problema con un JPanel e con il disegno di un rettangolo con il mouse.
    in pratica riempio il JPanel con una immagine e poi selezione un'area con il mouse.
    quest'area la salvo in un'altra immagine:
    codice:
    private class ImagePanel extends JPanel implements MouseListener, MouseMotionListener {
    
            private BufferedImage buff;
            private Rectangle currentRect;
            private String fileDelete;
            private int xx = 0;
            private int yy = 0;
            private int w = 0;
            private int h = 0;
            boolean done = false;
    
            public ImagePanel(String path) {
                setLayout(new BorderLayout());
                setPreferredSize(new Dimension(width, height));
                fileDelete = path;
                try {
                    buff = ImageIO.read(new File(path));
                    button.addActionListener(new ActionListener() {
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            capture(e);
                        }
                    });
                    addMouseListener(this);
                    addMouseMotionListener(this);
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
    
            @Override
            public void mousePressed(MouseEvent e) {
                xx = e.getX();
                yy = e.getY();
                currentRect = new Rectangle(xx, yy, 0, 0);
            }
    
            @Override
            public void mouseDragged(MouseEvent e) {
                currentRect.setSize(e.getX() - currentRect.x, e.getY() - currentRect.y);
                repaint();
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
                w = e.getX() - currentRect.x;
                h = e.getY() - currentRect.y;
                currentRect.setSize(w, h);
                done = true;
                repaint();
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(buff, 0, 0, this);
                if (done) {
                    g.drawRect(xx, yy, w, h);
                }
            }
    
            public void capture(ActionEvent e) {
                try {
                    FileChooserPanel.salva(xx, yy, w, h);
                    DeleteTemp.delete(fileDelete);
                } catch (AWTException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
    
            @Override
            public void mouseClicked(MouseEvent e) {
            }
    
            @Override
            public void mouseEntered(MouseEvent e) {
            }
    
            @Override
            public void mouseExited(MouseEvent e) {
            }
    
            @Override
            public void mouseMoved(MouseEvent e) {
            }
        }
    il problema è che prende un pezzo di parte sopra la selezione e taglia un pezzo di parte sotto.
    avete qualche idea??

  2. #2
    mi sono dimenticato un pezzo.
    alla fine dei giochi l'area selezionata arriva a questo metodo di un'altra classe:
    codice:
        public static void manualScreen(String formato, String percorso, int x, int y, int w, int h) throws AWTException, IOException {
            Robot robot = new Robot();
            Rectangle area = new Rectangle(x, y, w, h);
            BufferedImage buff = robot.createScreenCapture(area);
            ImageIO.write(buff, formato, new File(percorso));
            JOptionPane.showMessageDialog(null, "Immagine salvata" + percorso);
        }
    nn so se può esserci una discordanza da qualche parte o è errato il modo in cui prendo le coordinate.
    nn riesco a capirlo.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    alla fine dei giochi l'area selezionata arriva a questo metodo di un'altra classe:
    codice:
        public static void manualScreen(String formato, String percorso, int x, int y, int w, int h) throws AWTException, IOException {
            Robot robot = new Robot();
            Rectangle area = new Rectangle(x, y, w, h);
            BufferedImage buff = robot.createScreenCapture(area);
            ImageIO.write(buff, formato, new File(percorso));
            JOptionPane.showMessageDialog(null, "Immagine salvata" + percorso);
        }
    nn so se può esserci una discordanza da qualche parte o è errato il modo in cui prendo le coordinate.
    nn riesco a capirlo.
    Beh, vedendo questo pezzo una cosa salta subito alla mente: Robot lavora con coordinate relative allo schermo. Mentre nel tuo ImagePanel le coordinate che gestisci sono relative al tuo pannello stesso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    ah nn sapevo di questa differenza.
    l'unico modo alternativo che mi viene in mente è impostare l'area direttamente sullo schermo, ma nn so se è fattibile in java.
    qualche alternativa c'è?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    ah nn sapevo di questa differenza.
    Per Robot lo (0,0) è l'angolo in alto-sinistra dello schermo. Nel tuo panello (0,0) è l'angolo in alto-sinistra del pannello stesso.

    Originariamente inviato da fermat
    l'unico modo alternativo che mi viene in mente è impostare l'area direttamente sullo schermo, ma nn so se è fattibile in java.
    qualche alternativa c'è?
    Sì. Innanzitutto vedo che nel pannello disegni una immagine. È questa la immagine da cui devi estrarre il rettangolo, giusto? Perché se la immagine ha origine nella origine (0,0) del pannello (e dal codice deduco che è così), allora le coordinate nel pannello sono anche corrette per la immagine. E quindi potresti prendere una sotto-immagine di questa. Vedi il getSubimage di BufferedImage.

    Altrimenti se vuoi usare Robot (ma non è una bellissima soluzione), ti tocca "traslare" le coordinate. Vedi ad esempio convertPointToScreen (e gli altri metodi di conversione) in javax.swing.SwingUtilities.
    Comunque nota che da Java 6 il MouseEvent fornisce anche le coordinate relative allo schermo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    si alla traslazione dell'immagine avevo pensatp, però nn mi piaceva molto come idea.
    invece ho usato getSubimage:
    codice:
            public void capture(ActionEvent e) {
                try {
                    BufferedImage subBuff = buff.getSubimage(xx, yy, w, h);               
                    jfc.salva(subBuff);
                    DeleteTemp.delete(fileDelete);
                } catch (AWTException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
    codice:
        public void manualScreenSub(String formato, String percorso, BufferedImage buff) throws AWTException, IOException {
            ImageIO.write(buff, formato, new File(percorso));
            JOptionPane.showMessageDialog(null, "Immagine salvata" + percorso);
        }
    grazie!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.