题
我是一位经验丰富的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:
- 降低 50%. --> 400x300
- 降低 50%. --> 200x150
- 降级 160x120.