Recorte de Imagem Utilizando um retangulo fixo

0 respostas
C

Ola pessoal!
tenho uma aplicação que criei com base em códigos da internet para testar recorte de imagem.
Pois bem, ela faz o seguinte:
abre uma imagem em um JComponent
tem um slider que serve para dar zoom
e eu posso desenhar um retângulo que recorta uma parte da imagem
porém ao invés de desenha com o mouse queria que tivesse um retangulo de tamanho fixo
que eu pudesse arrastar ele ou a imagem para enquadrar a parte que eu quero recortar

esses são os códigos que eu utilizo

public class Teste {

    //Lançador da aplicação
    public static void main(String[] args) throws Exception {

    final File url = new File(File.separator+"home"+File.separator+"meupc"+File.separator+"Imagens"+File.separator+"image.jpeg");

    final JSlider slider = new JSlider(0, 1000, 500);
    final ImageComponent image = new ImageComponent(url);
    slider.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            image.setZoom(2. * slider.getValue() / slider.getMaximum());
        }
    });

    JFrame frame = new JFrame("Test");
    frame.add(slider, BorderLayout.NORTH);          
    
    frame.add(new JScrollPane(image));    
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(700, 500);
    frame.setVisible(true);
}


    
}

class ImageComponent extends JComponent implements MouseListener, MouseMotionListener{
    // Classe que monta a tela e realiza as ações do Mouse
    final BufferedImage img;
    int drag_status = 0, c1, c2, c3, c4;
    public ImageComponent(File url) throws IOException {
        img = ImageIO.read(url);
        setZoom(1);
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Dimension dim = getPreferredSize();
        g.drawImage(img, 0, 0, dim.width, dim.height, this);
    }

    public void setZoom(double zoom) {
        int w = (int) (zoom * img.getWidth());
        int h = (int) (zoom * img.getHeight());
        setPreferredSize(new Dimension(w, h));
        revalidate();
        repaint();
    }

    // EU REMOVI OS MOUSELISTENERS QUE EU NÃO UTILIZO PARA NÃO FICAR MUITO GRANDE AQUI

    @Override
    public void mousePressed(MouseEvent e) {
        repaint();
        c1 = e.getX();
        c2 = e.getY();       
        
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        repaint();
        if(drag_status==1){
            c3 = e.getX();
            c4 = e.getY();            
            try{
                draggedScreen();
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        
    } 


    @Override
    public void mouseDragged(MouseEvent e) {
        repaint();
        drag_status = 1;
        c3 = e.getX();
        c4 = e.getY();      
        
    }

 
    
    @Override
    public void paint(Graphics g){
        super.paint(g);
        int w = c1 - c3;
        int h = c2 - c4;
        
        //h = h * -1;
        
        if(w<0){
            w = w * (- 1);
            if(h<0){
                h  *= -1;
            }
            g.drawRect(c1, c2, w, h);
        }else{
            g.drawRect(c1, c2, w, h);
        }
        
    }
    
    public void draggedScreen() throws Exception{
        int w = c1 - c3;
        int h = c2 - c4;
       
        if(w<0){
            w *= (-1);
        }
        if(h<0){
            h *= (-1);
        }
            
        
        Robot robo = new Robot();
        
        BufferedImage img = robo.createScreenCapture(new Rectangle(c1+65, c2+25, w, h));
        double scale = 0.5;        
        BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); 
        Graphics2D grph =  bi.createGraphics();
        grph.drawImage(img, 0, 0, 100, 100, null);
        ImageIO.write(bi, "JPG", new File(File.separator+"home"+File.separator+"meupc"+File.separator+"Imagens"+File.separator+"screen.jpg"));

        System.out.println("Recortado com sucesso");       
        new ImagemRecortada();
        
    } 

}
Após Recortar e Salvar eu abro o recorte em um frame
class ImagemRecortada extends JFrame {

    public ImagemRecortada() {
        ImagePanel im = new ImagePanel(File.separator+"home"+File.separator+"meupc"+File.separator+"Imagens"+File.separator+"screen.jpg");
        add(im);
        pack();
        setVisible(true);        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
}

// --------------------------------

    class ImagePanel extends JPanel {
 
          private Image img;
 
          public ImagePanel(String img) {
            this(new ImageIcon(img).getImage());
          }
 
          public ImagePanel(Image img) {
            this.img = img;
            Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
            setPreferredSize(size);
            setMinimumSize(size);
            setMaximumSize(size);
            setSize(size);
            setLayout(null);
          }
 
          public void paintComponent(Graphics g) {
            g.drawImage(img, 0, 0, null);
          }
 
        }

Desde já agradeço a ajuda

Criado 10 de abril de 2014
Respostas 0
Participantes 1