微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反转Java Graphics2D缩放和旋转坐标

我在 Java中使用Graphics2D来缩放和旋转我绘制的图片.我现在希望能够在我点击图片中的某个点时告诉原始坐标是什么.因此,考虑到旋转和缩放的坐标,我想计算原始坐标.有一个简单的方法吗?

解决方法

如果您保留了在绘制图像时使用的AffineTransform的副本,则可以使用
AffineTransform.inverseTransform(Point2D ptSrc,Point2D ptDst)
将设备空间坐标转换回用户空间

编辑:如果在绘制时捕获Graphics2D的当前变换,请注意Graphics2D被重用于同一窗口/面板的多个轻量级子项,因为那时变换将相对于父组件,但鼠标坐标将是相对于孩子.您需要捕获对变换所做的更改而不是其最终值.例:

import java.awt.Basicstroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) throws MalformedURLException,IOException {
        JFrame frame = new JFrame();
        Box Box = new Box(BoxLayout.Y_AXIS);
        BufferedImage image = ImageIO.read(new URL("http://sstatic.net/so/img/logo.png"));
        AffineTransform xfrm1 = AffineTransform.getScaleInstance(0.95,1.25);
        xfrm1.rotate(-0.3);
        Box.add(new ImageView(image,xfrm1));
        AffineTransform xfrm2 = AffineTransform.getShearInstance(0.1,0.2);
        xfrm2.scale(1.3,0.9);
        Box.add(new ImageView(image,xfrm2));
        frame.add(Box);
        frame.pack();
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

@SuppressWarnings("serial")
class ImageView extends JComponent {
    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        try {
            paintXfrm = g2d.getTransform();
            paintXfrm.invert();
            g2d.translate(getWidth() / 2,getHeight() / 2);
            g2d.transform(xfrm);
            g2d.translate(image.getWidth() * -0.5,image.getHeight() * -0.5);
            paintXfrm.concatenate(g2d.getTransform());
            g2d.drawImage(image,this);
        } catch (NoninvertibleTransformException ex) {
            ex.printstacktrace();
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(image.getWidth() * 2,image.getHeight() * 2);
    }

    ImageView(final BufferedImage image,final AffineTransform xfrm) {
        this.canvas = image.createGraphics();
        canvas.setColor(Color.BLACK);
        canvas.setstroke(new Basicstroke(3.0f));
        this.image = image;
        this.xfrm = xfrm;
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousepressed(MouseEvent e) {
                try {
                    mouseDownCoord = e.getPoint();
                    paintXfrm.inverseTransform(mouseDownCoord,mouseDownCoord);
                } catch (NoninvertibleTransformException ex) {
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                mouseDownCoord = null;
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                Point p = e.getPoint();
                try {
                    paintXfrm.inverseTransform(p,p);
                    if (mouseDownCoord != null) {
                        canvas.drawLine(mouseDownCoord.x,mouseDownCoord.y,p.x,p.y);
                        for (Component sibling: getParent().getComponents()) {
                            sibling.repaint();
                        }
                    }
                    mouseDownCoord = p;
                } catch (NoninvertibleTransformException ex) {
                    ex.printstacktrace();
                }
            }
        });
    }

    private Graphics2D canvas;
    private BufferedImage image;
    private AffineTransform xfrm;
    private AffineTransform paintXfrm;
    private Point mouseDownCoord;
}

原文地址:https://www.jb51.cc/java/127972.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐