我是一位经验丰富的Java程序员,但对Java2D还是比较陌生。我正在尝试缩放图像,但质量得到较差的结果。该图像是面板的预览,因此包含诸如文本和文本字段之类的内容。我将一直缩小规模,从不扩大规模。
目前,我正在使用以下代码:
g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
其中panelImage是全尺寸预览(BufferedImage),而scaledWidth和scaledHeight是各自的目标尺寸。我似乎在文本和诸如文本字段等事物的边缘失去了很多细节。
我应该使用更好的电话来缩放图像吗?
谢谢,
约翰
最佳答案
我可以提出的建议是,首先将图像调整到单独的 BufferedImage
上。原因是,可以获取Graphics2D
的 BufferedImage
对象,以生成质量更好的缩放图像。Graphics2D
可以接受“渲染提示”,该提示指示Graphics2D
对象应执行图像处理的方式。 setRenderingHint
方法是可用于设置那些渲染提示的方法之一。可以使用 RenderingHints
类的呈现提示。
然后,使用该Graphics2D
对象,可以使用之前指定的渲染提示将图像绘制到BufferedImage
。
粗略(未经测试)的代码将按以下方式工作:
BufferedImage scaledImage = new BufferedImage(
scaledWidth,
scaledHeight,
BufferedImage.TYPE_INT_RGB
);
Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
RenderingHints.Key.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC
);
g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
其他渲染提示可能包括:
KEY_ANTIALIASING
KEY_RENDERING
Java教程的Controlling Rendering Quality部分还提供了有关如何控制
Graphics2D
对象的呈现质量的更多信息。为了获得有关处理图形界面的大量信息,强烈建议使用Chet Haase和Romain Guy的Filthy Rich Clients。本书中有一节专门讨论缩放图像的问题,这似乎很相关。
关于Java2D : scaling issues,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/932479/