2013-04-04 2 views
1

В настоящее время я использую этот код (который я нашел 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; 
} 

ответ

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; 
} 
Смежные вопросы