【问题标题】:How to improve image rotation quality in Graphics2D?如何提高 Graphics2D 中的图像旋转质量?
【发布时间】:2013-04-04 13:56:56
【问题描述】:

目前我正在使用这段代码(我发现 here)在 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;
}

【问题讨论】:

    标签: java image rotation graphics2d image-rotation


    【解决方案1】:

    您也应该设置RenderingHints.KEY_INTERPOLATIONRenderingHints.KEY_RENDERING

    这是完整的工作代码:

    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) ;
    
        // this will further improve the quality
        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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 2012-11-12
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多