java - 如何提高 Graphics2D 中的图像旋转质量?

标签 java image rotation graphics2d image-rotation

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

最佳答案

您还应该设置 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;
}

关于java - 如何提高 Graphics2D 中的图像旋转质量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15813361/

相关文章:

css - 通过 CSS 模糊图像?

javascript - 在网格上将矩形元素旋转 90 度

android - 有没有办法用方法或代码来做 "setRotation()"?

image - 具有相同 imageSource 的多个图像并不总是加载 (Xamarin)

javascript - 为什么我的页面跳动这么多?

java - Android Java GoogleMap 如何判断 AVD 中正在运行哪个 Activity

java - 如何正确扩展 TextInputLayout.java

ios - UIToolbar 不适合屏幕

java - 等价于 c# 中的 matcher.start 和 matcher.end

Java 类型转换和原始类型