旋转 BufferedImage 时出现问题
我在使用 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;
}
旋转是一个简单的枚举,其值为 NONE、CLOCKWISE 和 COUNTERCLOCKWISE。
我的问题的症状显示在这里:
http://perp.se/so/rotate_problems.html
因此,旋转工作正常,但生成的图像未锚定到正确的坐标(或者应该如何表达)。因为我真的不知道我到底在做什么(我的线性代数很弱),所以我不知道如何自己解决这个问题。
我尝试过对 AffineTransform 实例进行一些随机摆弄,但它对我没有帮助(当然)。我尝试过谷歌搜索(并进行搜索),但我看到的所有示例基本上都使用与我相同的方法......这对我不起作用。
感谢您的建议。
I have some problems with rotating images in Java using the AffineTransform class.
I have the following method for creating a rotated (90 degrees) copy of an image:
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;
}
Rotation is a simple enum with the values NONE, CLOCKWISE and COUNTERCLOCKWISE.
The symptoms of my problems are displayed here:
http://perp.se/so/rotate_problems.html
So, the rotation works OK, but the resulting images aren't anchored to the correct coordinates (or how one should put it). And since I don't really know what the heck I'm doing in the first place (my linear algebra is weak), I don't know how to solve this on my own.
I've tried with some random fiddling with the AffineTransform instance, but it hasn't helped me (of course). I've tried googling (and searching SO), but all examples I've seen basically use the same approach as I do... which doesn't work for me.
Thankful for advice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果必须将变换表示为单个旋转,则锚点取决于旋转方向:
(w/2, w/2)
或(h/2, h/2 )
。但表达为
translate; 可能更简单。旋转;翻译
,例如还可以考虑使用
getQuadrantRotateInstance
而不是getRotateInstance
。If you must express the transform as a single rotation, the anchor point depends on the direction of rotation: Either
(w/2, w/2)
or(h/2, h/2)
.But it's probably simpler to express as
translate; rotate; translate
, e.g.Also consider using
getQuadrantRotateInstance
instead ofgetRotateInstance
.由于您只需要 90 度旋转,因此您可以避免使用 AffineTransform 东西:
这也可以避免切断矩形图像的边缘。
来自:http://snippets.dzone.com/posts/show/2936
Since you only need 90 degree rotation you can avoid using the AffineTransform stuff:
This also avoids cutting off edges of rectangular images.
From: http://snippets.dzone.com/posts/show/2936
您可以尝试另一种方法并从图像创建一个图标,然后使用 旋转的图标。
或者您可以尝试我在 Sun 论坛中找到的旧代码:
You could try an alternative appoach and create an Icon from the image and then use a Rotated Icon.
Or you can try this old code I found in the Sun forums:
我不知道这是否是你的问题。
为什么不尝试呢?
或者
I don't know if this might be your issue.
Why not try?
OR