Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么BuffereImage不按照在paintComponent方法中绘制的矩形进行剪切(其高度计算错误)?_Java_Image_Swing - Fatal编程技术网

Java 为什么BuffereImage不按照在paintComponent方法中绘制的矩形进行剪切(其高度计算错误)?

Java 为什么BuffereImage不按照在paintComponent方法中绘制的矩形进行剪切(其高度计算错误)?,java,image,swing,Java,Image,Swing,我编写了一个能够让用户剪切图像的应用程序。 目前,下面的代码将图像剪切到绘制的矩形上方一点(其目的是显示用户想要剪切图像的坐标) 公共类ScreenCaptureRectangle扩展JFrame实现MouseListener、MouseMotionListener{ 内部阻力状态=0,c1,c2,c3,c4; 公营部门{ ImagePanel im=新的ImagePanel(PicChanges.getNewImage()); JScrollPane scrollPane=新的JScrollP

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

公共类ScreenCaptureRectangle扩展JFrame实现MouseListener、MouseMotionListener{
内部阻力状态=0,c1,c2,c3,c4;
公营部门{
ImagePanel im=新的ImagePanel(PicChanges.getNewImage());
JScrollPane scrollPane=新的JScrollPane(im);
添加(滚动窗格);
设置大小(500400);
setVisible(真);
我是addMouseListener(这个);
im.addMouseMotionListener(this);
}
public void draggedScreen()引发异常{
int w=c1-c3;
int h=c2-c4;
w=w*-1;
h=h*-1;
机器人=新机器人();
BuffereImage img=robot.createScreenCapture(新矩形(c1、c2、w、h));
文件保存路径=新文件(“screen1.jpg”);
写入(img,“JPG”,保存路径);
System.out.println(“已成功保存裁剪图像”);
}
@凌驾
公共无效鼠标单击(鼠标事件arg0){
}
@凌驾
公共无效鼠标事件(鼠标事件arg0){
}
@凌驾
public void mouseexitted(MouseEvent arg0){
}
@凌驾
public void mousePressed(MouseEvent arg0){
重新油漆();
c1=arg0.getX();
c2=arg0.getY();
}
@凌驾
公共无效MouseEvent arg0{
重新油漆();
如果(拖动状态==1){
c3=arg0.getX();
c4=arg0.getY();
试一试{
重新油漆();
DragedScreen();
}捕获(例外e){
e、 printStackTrace();
}
}否则{
System.out.println(“发行正在建设中”);
}
}
@凌驾
公共无效鼠标标记(鼠标事件arg0){
重新油漆();
拖动状态=1;
c3=arg0.getX();
c4=arg0.getY();
}
@凌驾
public void mouseMoved(MouseEvent arg0){
}
公共空间涂料(图g){
超级油漆(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);
}
公共类ImagePanel扩展了JPanel{
专用缓冲区图像输出;
公共图像面板(BuffereImage img){
this.imageToCut=img;
维度大小=新维度(imageToCut.getWidth(null)、imageToCut.getHeight(null));
设置首选大小(大小);
setMaximumSize(大小);
设置最小尺寸(尺寸);
设置大小(大小);
}
@凌驾
受保护组件(图形g){
g、 drawImage(imageToCut,0,0,null);
}
}
从现在开始,当用户像这样裁剪图像时:

他收到了这个:

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

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

感谢我收到的建议,现在我不会在用户单击“剪切”按钮后打开一个单独的相框来剪切照片,我只是将鼠标光标添加到JFrame中,这更方便、更友好。照片是根据鼠标光标的坐标正确剪切的:

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

1) 为了更快地获得更好的帮助,请添加一个或。例如,like in(这似乎是这个问题的基础!)。2)查看一个我再也懒得解决的问题。请将问题添加到代码结尾处的结尾前添加4个空格符。
。如果要使用
机器人
,您需要将
MouseEvent
报告的坐标更改为屏幕坐标,它们当前被报告为相对于组件的组件坐标
MouseListener
也被注册,因为组件是相对于
ImagePanel
,你正在画框上绘制的矩形将被错误地表示。你需要查看机器人相对于屏幕的切割-鼠标点的坐标相对于程序窗口-因此你需要玩这个-从程序窗口的开始开始,并将其添加到计算机屏幕的开始-然后,如果你在一个帧内有一个JPanel,它也会改变相对坐标-所以你需要播放-在每种情况下放置矩形来查看点的位置
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) {
}