提高图像旋转质量

时间:2013-04-04 13:56:57

标签: java image rotation image-rotation

目前我正在使用此代码(我发现here)来在java中旋转图像。代码效果很好,但我对旋转图像的质量不满意。你们可以帮助我改进它吗?或者你能为java推荐一个好的图像旋转库吗?

public static BufferedImage rotate(BufferedImage image, float angle) 
{
    float radianAngle = (float) Math.toRadians(angle) ; 

    float sin = (float) Math.abs(Math.sin(radianAngle));
    float cos = (float) Math.abs(Math.cos(radianAngle));

    int w = image.getWidth() ;
    int h = image.getHeight();

    int neww = (int) Math.round(w * cos + h * sin);
    int newh = (int) Math.round(h * cos + w * sin);

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    GraphicsConfiguration gc = gd.getDefaultConfiguration();

    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT);
    Graphics2D g = result.createGraphics();

    //---------------------------------------------------------------------
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    g.translate((neww-w)/2, (newh-h)/2);
    g.rotate(radianAngle, w/2, h/2);
    //---------------------------------------------------------------------

    g.drawRenderedImage(image, null);
    g.dispose();

    return result;
}

1 个答案:

答案 0 :(得分:2)

以下是完整的工作代码:

public static BufferedImage rotate(BufferedImage image, float angle) 
{
    float radianAngle = (float) Math.toRadians(angle) ; 

    float sin = (float) Math.abs(Math.sin(radianAngle));
    float cos = (float) Math.abs(Math.cos(radianAngle));

    int w = image.getWidth() ;
    int h = image.getHeight();

    int neww = (int) Math.round(w * cos + h * sin);
    int newh = (int) Math.round(h * cos + w * sin);

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    GraphicsConfiguration gc = gd.getDefaultConfiguration();

    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT);
    Graphics2D g = result.createGraphics();

    //-----------------------MODIFIED--------------------------------------
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) ;
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC) ;
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY) ;

    AffineTransform at = AffineTransform.getTranslateInstance((neww-w)/2, (newh-h)/2);
    at.rotate(radianAngle, w/2, h/2);
    //---------------------------------------------------------------------

    g.drawRenderedImage(image, at);
    g.dispose();

    return result;
}