Я пишу приложение с возможностью для пользователя вырезать изображения.
В настоящее время приведенный ниже код обрезает изображение чуть выше нарисованного прямоугольника (цель которого - показать, по каким координатам пользователь на самом деле хочет обрезать изображение).
public class ScreenCaptureRectangle extends JFrame implements MouseListener, MouseMotionListener {
int drag_status = 0, c1, c2, c3, c4;
public void cut() {
ImagePanel im = new ImagePanel(PicChanges.getNewImage());
JScrollPane scrollPane = new JScrollPane(im);
add(scrollPane);
setSize(500, 400);
setVisible(true);
im.addMouseListener(this);
im.addMouseMotionListener(this);
}
public void draggedScreen() throws Exception {
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2, w, h));
File save_path = new File("screen1.jpg");
ImageIO.write(img, "JPG", save_path);
System.out.println("Cropped image saved successfully.");
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
repaint();
c1 = arg0.getX();
c2 = arg0.getY();
}
@Override
public void mouseReleased(MouseEvent arg0) {
repaint();
if (drag_status == 1) {
c3 = arg0.getX();
c4 = arg0.getY();
try {
repaint();
draggedScreen();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("Issue is under construction");
}
}
@Override
public void mouseDragged(MouseEvent arg0) {
repaint();
drag_status = 1;
c3 = arg0.getX();
c4 = arg0.getY();
}
@Override
public void mouseMoved(MouseEvent arg0) {
}
public void paint(Graphics g) {
super.paint(g);
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
if (w < 0)
w = w * -1;
g.setColor(Color.RED);
g.drawRect(c1, c2, w, h);
}
public class ImagePanel extends JPanel {
private BufferedImage imageToCut;
public ImagePanel(BufferedImage img) {
this.imageToCut = img;
Dimension size = new Dimension(imageToCut.getWidth(null), imageToCut.getHeight(null));
setPreferredSize(size);
setMaximumSize(size);
setMinimumSize(size);
setSize(size);
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(imageToCut, 0, 0, null);
}
}
На данный момент, когда пользователь обрезает изображение следующим образом:
Он получает это:
Моя цель - получить следующий результат:
Я использую слушателей мыши, чтобы получить координаты нарисованного прямоугольника, а затем с помощью этих координат вырезать изображение. Теперь изображение обрезано с неверной высотой (как я ее вижу).
Буду признателен, если кто-нибудь скажет мне, что может быть не так в коде?
Спасибо!