2011-09-01 72 views

回答

10

帆布是awt而不是swing。改为尝试JPanelExample

但是,如果您已经完成全幅图像缩放,请尝试在sub-image上进行同样的操作。

BufferedImage.getSubimage(x, y, w, h); 

编辑

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class Example { 

    private Point startPoint = new Point(0, 0); 
    private Point rectLocale = new Point(); 
    private Dimension rectSize = new Dimension(); 
    private int zoom = 80; 
    private BufferedImage capture = null; 
    private BufferedImage raw; 

    public Example() throws Exception { 
     raw = new Robot().createScreenCapture(new Rectangle(
       Toolkit.getDefaultToolkit().getScreenSize())); 
     MouseBehavior behavior = new MouseBehavior(); 
     JPanel b = new JPanel() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Dimension getMinimumSize() { 
       return new Dimension(500, 500); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(500, 500); 
      } 

      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D g2d = ((Graphics2D) g); 
       g2d.drawImage(raw, 0, 0, null); 
       if (capture != null) { 
        int width2 = (int) (rectSize.width + rectSize.width * (zoom/500d)); 
        int height2 = (int) (rectSize.height + rectSize.height * (zoom/500d)); 
        int x2 = rectLocale.x - ((width2 - rectSize.width)/2); 
        int y2 = rectLocale.y - ((height2 - rectSize.height)/2); 
        Image scaledInstance = capture.getScaledInstance(
          width2, height2, Image.SCALE_AREA_AVERAGING); 
        g2d.drawImage(scaledInstance, x2, y2, null); 
        g2d.drawRect(x2, y2, width2, height2); 
       } else { 
        g2d.draw(new Rectangle(rectLocale, rectSize)); 
       } 
      } 
     }; 
     b.addMouseMotionListener(behavior); 
     b.addMouseListener(behavior); 
     b.addMouseWheelListener(behavior); 
     JFrame f = new JFrame(); 
     f.setLocation(10, 10); 
     f.setDefaultCloseOperation(3); 
     f.add(b); 
     f.pack(); 
     f.setVisible(true); 
    } 

    private class MouseBehavior extends MouseAdapter { 

     @Override 
     public void mousePressed(MouseEvent e) { 
      startPoint = e.getPoint(); 
      rectLocale = new Point(); 
      rectSize = new Dimension(); 
      capture = null; 
      if (e.getSource() instanceof JComponent) { 
       ((JComponent) e.getSource()).repaint(); 
      } 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      Point currentPoint = e.getPoint(); 
      rectSize.width = Math.abs(currentPoint.x - startPoint.x); 
      rectSize.height = Math.abs(currentPoint.y - startPoint.y); 
      if (e.isShiftDown()) { 
       rectSize.width = rectSize.height = Math.min(
         rectSize.width, rectSize.height); 
       int dx = startPoint.x - rectSize.width; 
       int dy = startPoint.y - rectSize.height; 
       rectLocale.x = startPoint.x < currentPoint.x ? startPoint.x 
         : Math.max(dx, dy); 
       rectLocale.y = startPoint.y < currentPoint.y ? startPoint.y 
         : Math.min(dx, dy); 
      } else { 
       rectLocale.x = Math.min(currentPoint.x, startPoint.x); 
       rectLocale.y = Math.min(currentPoint.y, startPoint.y); 
      } 
      if (e.getSource() instanceof JComponent) { 
       ((JComponent) e.getSource()).repaint(); 
      } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      if (rectSize.width <= 0 || rectSize.height <= 0) { 
       capture = null; 
      } else { 
       capture = raw.getSubimage(Math.max(0, rectLocale.x), 
         Math.max(0, rectLocale.y), rectSize.width, rectSize.height); 
      } 
      if (e.getSource() instanceof JComponent) { 
       ((JComponent) e.getSource()).repaint(); 
      } 
     } 

     @Override 
     public void mouseWheelMoved(MouseWheelEvent e) { 
      zoom = Math.min(2000, Math.max(0, zoom + e.getUnitsToScroll() * 10)); 
      if (e.getSource() instanceof JComponent) { 
       ((JComponent) e.getSource()).repaint(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        Example example = new Example(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
+0

谢谢您的回答。问题是如何获得用户选择的矩形区域的坐标,宽度和高度。 – NSR

+0

见编辑; e.isShiftDown()'部分用于绘制正方形而不是矩形,如果在拖动鼠标时按SHIFT键 – oliholz

+0

请参阅new edit;修正了一些错误和比例,并通过鼠标滚动缩放 – oliholz