【问题标题】:How to Zoom specific area of Image on Canvas in Swing如何在 Swing 中缩放画布上图像的特定区域
【发布时间】:2011-11-08 03:23:09
【问题描述】:

我想缩放图像上的特定区域。由用户选择。使用 Swing 在画布上显示图像。我已经在画布上完成了完整的图像缩放,但无法实现特定区域的缩放。 请帮忙

【问题讨论】:

    标签: java image swing canvas


    【解决方案1】:

    画布是 awt 而不是 swing。请改用JPanelExample.

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

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

    编辑

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

    【讨论】:

    • 感谢您的回答。问题是如何获取用户选择的矩形区域的坐标、宽度、高度。
    • 查看编辑; e.isShiftDown() 部分用于绘制正方形而不是矩形,如果您在拖动鼠标的同时按 SHIFT
    • 查看新编辑;通过鼠标滚动修复了一些错误和比例和缩放
    • 它给出错误,如何解决这个问题.... java.awt.Component 中的 addMouseWheelListener(java.awt.event.MouseWheelListener) 不能应用于 (Example.MouseBehavior) b.addMouseWheelListener(behavior) ;
    • 感谢大家的回答,我已经完成了并且工作完美
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2016-04-13
    • 2020-04-08
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多