是的,这是一个已知的问题,但可以通过一种聪明的技巧解决,我曾在Chris Campbell的博客文章中找到过:
的确,在使用Graphics.drawImage()渲染时,Sun的Java 2D实现不会自动抗锯齿图像边缘。然而,有一个简单的解决方法:使用TexturePaint,并渲染一个经过变换/抗锯齿处理的fillRect()。
这是我使用的代码,改编自他博客中的代码:
boolean fast = ((Math.abs(Math.toDegrees(angle)) % 90) == 0.0);
int w = source.getWidth();
int h = source.getHeight();
double sin = Math.abs(Math.sin(angle));
double cos = Math.abs(Math.cos(angle));
int newW = (int) Math.floor(w * cos + h * sin);
int newH = (int) Math.floor(h * cos + w * sin);
BufferedImage dest = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);
AffineTransform transform = AffineTransform.getTranslateInstance((newW - w) / 2.0, (newH - h) / 2.0);
transform.rotate(angle, w / 2.0, h / 2.0);
Graphics2D g = dest.createGraphics();
try {
g.transform(transform);
if (!fast) {
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setPaint(new TexturePaint(source,
new Rectangle2D.Float(0, 0, source.getWidth(), source.getHeight())));
g.fillRect(0, 0, source.getWidth(), source.getHeight());
}
else {
g.drawImage(source, 0, 0, null);
}
}
finally {
g.dispose();
}