【问题标题】:AffineTansform and Graphicsd2D drawing locationAffineTansform 和 Graphicsd2D 绘图位置
【发布时间】:2025-12-09 10:10:02
【问题描述】:

代码:

AffineTransform at = new AffineTransform();
at.scale(2, 1);
at.rotate(Math.toRadians(45));
at = new AffineTransform(at);
at.translate(-img.getWidth()/2, -img.getHeight()/2);
g2D.setTransform(at);
g2D.drawImage(img, 0, 0, null);
g2D.drawImage(img, 16, 0, null);
g2D.drawImage(img, 32, 0, null);
g2D.dispose();

这会在 [0,0]、[16,8]、[32,16] 位置绘制我的图像(原始尺寸 16x16)。 即它采用现在已转换的原始轴并将其绘制在转换后的坐标上。

但是,我并不总是想要这个。 如何让图像显示在我输入的确切坐标处,忽略转换后的 X 轴和 Y 轴?

【问题讨论】:

    标签: java graphics transform graphics2d affinetransform


    【解决方案1】:

    您需要先保存 Graphics2d 对象的转换,然后再将其设置为新的转换,这样您就可以在转换完成后切换到原始参考系统。

    AffineTransform at = new AffineTransform();
    AffineTransform g2dAffineTransform = g2d.getTransform();
    at.scale(2, 1);
    at.rotate(Math.toRadians(45));
    at = new AffineTransform(at);
    at.translate(-img.getWidth()/2, -img.getHeight()/2);
    g2D.setTransform(at);
    g2D.drawImage(img, 0, 0, null);
    g2D.drawImage(img, 16, 0, null);
    g2D.drawImage(img, 32, 0, null);
    
    //Reset the transform
    g2d.setTransform(g2dAffineTransform);
    //All rendering with this g2d is now at the original coordinate system
    //g2d.draw...
    g2D.dispose();
    

    【讨论】:

    • 效果很好,但不能完全回答我的问题。这样做是在绘制图像后重置转换。然而,这不是我的问题。我的问题是,如果我在Graphics2D 上应用我的AffineTransformation,x 和y 轴也会发生变化。我想在未转换的轴上绘制转换后的图像。不过,我非常感谢您的回复。
    • 你的回答确实把我带到了AffineTransformOp,因为你使用了一些我以前没有想到的东西,这把我带到了那里。我现在使用AffineTransformOp 转换我的图像,它只转换图像而不是图形。谢谢!