我可以旋转已添加到JLabel的图像。唯一的问题是,如果高度和宽度不相等,旋转的图像将不再出现在JLabel的原点(0,0)。
这就是我正在做的事情。我也尝试过使用AffineTransform并旋转图像本身,但效果相同。
Graphics2D g2d = (Graphics2D)g;
g2d.rotate(Math.toRadians(90), image.getWidth()/2, image.getHeight()/2);
super.paintComponent(g2d);
如果我有一个宽度大于其高度的图像,使用此方法旋转该图像然后绘制它将导致图像垂直绘制在点0,0上方,并水平到点0的右侧,0
答案 0 :(得分:4)
使用g2d.transform()将图像移回需要的位置。我只是在想象计算可能是什么,但我想是这样的:
int diff = ( image.getWidth() - image.getHeight() ) / 2;
g2.transform( -diff, diff );
顺便说一句,您可能会遇到报告其首选大小的标签问题 - 您可能需要覆盖getPreferredSize()并考虑轮换图像宽度和高度(如果已旋转)。
答案 1 :(得分:3)
AffineTransform trans = new AffineTransform(0.0, 1.0, -1.0, 0.0, image.getHeight(), 0.0);
g2d.transform(trans);
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
答案 2 :(得分:2)
如果它是一个完美的正方形,以下函数将旋转一个不确定的缓冲图像。
public BufferedImage rotate(BufferedImage image)
{
/*
* Affline transform only works with perfect squares. The following
* code is used to take any rectangle image and rotate it correctly.
* To do this it chooses a center point that is half the greater
* length and tricks the library to think the image is a perfect
* square, then it does the rotation and tells the library where
* to find the correct top left point. The special cases in each
* orientation happen when the extra image that doesn't exist is
* either on the left or on top of the image being rotated. In
* both cases the point is adjusted by the difference in the
* longer side and the shorter side to get the point at the
* correct top left corner of the image. NOTE: the x and y
* axes also rotate with the image so where width > height
* the adjustments always happen on the y axis and where
* the height > width the adjustments happen on the x axis.
*
*/
AffineTransform xform = new AffineTransform();
if (image.getWidth() > image.getHeight())
{
xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getWidth());
xform.rotate(_theta);
int diff = image.getWidth() - image.getHeight();
switch (_thetaInDegrees)
{
case 90:
xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff);
break;
case 180:
xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff);
break;
default:
xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth());
break;
}
}
else if (image.getHeight() > image.getWidth())
{
xform.setToTranslation(0.5 * image.getHeight(), 0.5 * image.getHeight());
xform.rotate(_theta);
int diff = image.getHeight() - image.getWidth();
switch (_thetaInDegrees)
{
case 180:
xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight());
break;
case 270:
xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight());
break;
default:
xform.translate(-0.5 * image.getHeight(), -0.5 * image.getHeight());
break;
}
}
else
{
xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getHeight());
xform.rotate(_theta);
xform.translate(-0.5 * image.getHeight(), -0.5 * image.getWidth());
}
AffineTransformOp op = new AffineTransformOp(xform, AffineTransformOp.TYPE_BILINEAR);
BufferedImage newImage =new BufferedImage(image.getHeight(), image.getWidth(), image.getType());
return op.filter(image, newImage);
}
答案 3 :(得分:1)
Rotated Icon课程可能就是你要找的。 p>