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
[code]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();
}
}[/code]
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