2010-04-22 98 views
3

我可以旋转已添加到JLabel的图像。唯一的问题是,如果高度和宽度不相等,旋转的图像将不再出现在JLabel的原点(0,0)处。如何使用Java/Swing旋转图像,然后将其原点设置为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

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

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

顺便说一句,你可能有标签报告其首选大小的一个问题 - 你可能需要重写的getPreferredSize()和帐户用于交换图像的宽度和高度如果旋转。

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

下面的函数将旋转一个缓冲图像,如果它是一个完美的正方形,它将不确定。

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); 
} 
+0

奇妙的代码!感谢您成为唯一一家严格回应图片旋转的答案,而不是将其锁定到Graphics2D。 – AnthonyW 2014-12-03 13:44:29

相关问题