[英]How to improve image rotation quality in Graphics2D?
Currently I am using this code (which I found here ) to rotate images in Java.目前我正在使用此代码(我在此处找到)在 Java 中旋转图像。 The code works well, but I am not satisfied with the quality of the rotated image.代码运行良好,但我对旋转图像的质量不满意。
How can I improve it?我该如何改进? Do it need a separate library that?它需要一个单独的库吗?
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;
}
You should set RenderingHints.KEY_INTERPOLATION
and RenderingHints.KEY_RENDERING
as well.您还应该设置RenderingHints.KEY_INTERPOLATION
和RenderingHints.KEY_RENDERING
。
Here is the complete working code:这是完整的工作代码:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.