如何使用Java / Swing旋转图像,然后将其原点设置为0,0?

时间:2010-04-22 02:42:15

标签: java swing graphics2d

我可以旋转已添加到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

4 个答案:

答案 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课程可能就是你要找的。