3

我能够旋转已添加到 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

4 回答 4

4

使用 g2d.transform() 将图像移回需要的位置。我只是在想象计算可能是什么,但我认为是这样的:

int diff = ( image.getWidth() - image.getHeight() ) / 2;
g2.transform( -diff, diff );

顺便说一句,您可能对报告其首选大小的标签有问题 - 您可能需要覆盖 getPreferredSize() 并考虑在旋转时交换图像的宽度和高度。

于 2010-04-22T03:54:51.053 回答
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);
于 2010-04-22T06:09:15.503 回答
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);
}
于 2012-06-20T15:17:53.397 回答
1

Rotated Icon类可能是您正在寻找的。

于 2010-04-22T02:45:27.317 回答