per*_*erp 10 java image rotation affinetransform
使用AffineTransform类在Java中旋转图像时遇到一些问题.
我有以下方法来创建图像的旋转(90度)副本:
private BufferedImage createRotatedCopy(BufferedImage img, Rotation rotation) {
int w = img.getWidth();
int h = img.getHeight();
BufferedImage rot = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);
double theta;
switch (rotation) {
case CLOCKWISE:
theta = Math.PI / 2;
break;
case COUNTERCLOCKWISE:
theta = -Math.PI / 2;
break;
default:
throw new AssertionError();
}
AffineTransform xform = AffineTransform.getRotateInstance(theta, w / 2, h / 2);
Graphics2D g = (Graphics2D) rot.createGraphics();
g.drawImage(img, xform, null);
g.dispose();
return rot;
}
Run Code Online (Sandbox Code Playgroud)
旋转是一个简单的枚举,值为NONE,CLOCKWISE和COUNTERCLOCKWISE.
我的问题的症状显示在这里:
http://perp.se/so/rotate_problems.html
因此,旋转工作正常,但生成的图像不会锚定到正确的坐标(或应该如何放置).因为我真的不知道我在做什么(我的线性代数很弱),我不知道如何自己解决这个问题.
我尝试了一些随机摆弄AffineTransform实例,但它没有帮助我(当然).我试过谷歌搜索(并搜索SO),但我见过的所有例子基本上都使用与我相同的方法...这对我不起作用.
感谢您的建议.
fin*_*nnw 17
如果必须将变换表示为单个旋转,则锚点取决于旋转方向:(w/2, w/2)或者是(h/2, h/2).
但是表达的可能更简单translate; rotate; translate,例如
AffineTransform xform = new AffineTransform();
xform.translate(0.5*h, 0.5*w);
xform.rotate(theta);
xform.translate(-0.5*w, -0.5*h);
Run Code Online (Sandbox Code Playgroud)
也考虑使用getQuadrantRotateInstance而不是getRotateInstance.