我是一位经验丰富的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/

    10-12 06:15