gpt4 book ai didi

java - 为什么BufferedImage没有按照paintComponent方法中绘制的矩形进行切割(其高度计算错误)?

转载 作者:行者123 更新时间:2023-12-02 09:58:44 24 4
gpt4 key购买 nike

我编写了一个能够让用户剪切图像的应用程序。目前,下面的代码将图像剪切到绘制的矩形上方一点点(其目的是显示用户实际上想要用哪个坐标来剪切图像。)

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);
}
}

目前,当用户像这样裁剪图像时:

enter image description here

他明白了:

enter image description here

我的目标是获得以下结果:

enter image description here

我使用鼠标监听器来获取绘制的矩形的坐标,然后使用这些坐标剪切图像。现在图像被切割成不正确的高度(正如我所见)。如果有人能告诉我代码中可能有什么问题,我将不胜感激?谢谢!

最佳答案

感谢我收到的建议,现在用户单击“剪切”按钮后,我不再打开单独的框架来剪切照片,而是将 MouseListener 添加到 JFrame 中,这更加方便和用户友好。根据 MouseListener 的坐标,照片被正确剪切:

public class ImageScreenShot extends JFrame implements MouseListener, MouseMotionListener {

int drag_status = 0, c1, c2, c3, c4;

public int getC1() {
return c1;
}

public int getC2() {
return c2;
}

public int getC3() {
return c3;
}

public int getC4() {
return c4;
}

public void cut() {
GraphicalUserInterface.getFrame().addMouseMotionListener(this);
GraphicalUserInterface.getFrame().addMouseListener(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);
GraphicalUserInterface.getLabelIcon().setIcon(new ImageIcon(new ImageIcon(img).getImage().getScaledInstance(img.getWidth(), img.getHeight(), Image.SCALE_SMOOTH)));
JOptionPane.showConfirmDialog(null, "Would you like to save your cropped Pic?");
if (JOptionPane.YES_OPTION == 0) {
/**Need to implement some code*/
} else {
/**Need to implement some code*/

}
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) {
c1 = arg0.getXOnScreen();
c2 = arg0.getYOnScreen();
}

@Override
public void mouseReleased(MouseEvent arg0) {
if (drag_status == 1) {
c3 = arg0.getXOnScreen();
c4 = arg0.getYOnScreen();
try {
draggedScreen();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("Issue is under construction");
}
}

@Override
public void mouseDragged(MouseEvent arg0) {
drag_status = 1;
c3 = arg0.getXOnScreen();
c4 = arg0.getYOnScreen();
}

@Override
public void mouseMoved(MouseEvent arg0) {
}

关于java - 为什么BufferedImage没有按照paintComponent方法中绘制的矩形进行切割(其高度计算错误)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55791124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com