我是一位经验丰富的Java程序员,但对Java2D的新手相对较新。我正在尝试扩展图像,但质量较差。该图像是面板的预览,因此包含文本和文本字段之类的内容。我将永远缩减,永远不会上升。

目前,我正在使用以下代码: -

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

其中面板是全尺寸的预览(BufferedImage),缩放宽度和缩放率是相应的目标尺寸。我似乎在文本和诸如Textfields等的文字和边缘中失去了很多细节。

我应该使用更好的电话来扩展图像吗?

谢谢,约翰

有帮助吗?

解决方案

我可以提出的建议是首先将图像大小调整到一个单独的 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();

其他感兴趣的提示可能包括:

控制渲染质量 Java教程的部分还提供了有关如何控制渲染质量的更多信息 Graphics2D 对象。

并且有关一般处理图形接口的非常好的信息来源, 富有富裕的客户 强烈推荐Chet Haase和Romain Guy。本书的一部分涉及缩放图像的问题,这似乎很重要。

其他提示

可能是您应该打电话:

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Coobird是正确的,您需要逐步下尺度(最好使用Bicubic),以获得足够小的缩略图的好看结果。 Image.GetScaledInstance用于使用Area_aver的方法来做到这一点,但它比Chris Campbell在其“ Image.GetScaledInstance()”文章中所提出的原始降级速度要慢得多。

请原谅这里的自我促销 imgscalr.

它可根据Apache 2许可证提供,并且源全部在GitHub上;图书馆的目的是在本机Java Dead-easy(1类,5个静态方法)中进行图像尺度,并确保最佳的结果(这是您最初想要的),这是最快的结果(在大图像中缩放时很快)或两者之间的平衡,让库决定使用哪个。

我只是想要一个可以“调整我的形象大小并摆脱困境”的lib,并且在阅读所有这些帖子几天之后,我解决了疼痛点(我自己也是我自己的痛苦),并为任何人分享了工作否则可能会有所帮助。

COOBIRD 有正确的想法。我也会尝试 RenderingHints.VALUE_INTERPOLATION_BILINEAR 插值,看看看起来更好。不过,在升级时,双子木效果更好。为了在缩小缩放时取得最佳效果,应该 下降几个步骤. 。首先将分辨率减半,然后再次减半,等等。直到您接近所需的分辨率(即您不能减半或图像将变得太小)。最后一步是缩小到所需的分辨率。

例如,假设您的输入图像是 800x600 你想降低 160x120:

  1. 降低 50%. --> 400x300
  2. 降低 50%. --> 200x150
  3. 降级 160x120.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top