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