我正在用Java创建图像,这些图像上写有透明背景的字体。我使字体使用不同的颜色以及不同类型的字体样式,因此我需要使程序具有动态性。问题是我正在使用Graphics2D并使用g2d.drawString()在缓冲图像上写入,图像几乎不是我要寻找的定义。我尝试过创建具有大字体大小的大图像,然后缩小比例,但这也不起作用。我还将所有可能的RenderingHints设置为最高定义。我希望像素密度足够高,如果将其与视网膜屏幕上的常规文本进行比较,则不会有太大区别。谢谢。
要在Java中获得“视网膜”质量的图像,您必须BufferedImage
在两个维度上创建和渲染两倍于正常大小的图像(这会使图像放大4倍,我认为这就是@MadProgrammer的意思)。
然后,你一定不会下采样(或“规模”)在Java中的形象,而是保持BufferedImage
在全尺寸,且只画了一半大小的图像以原生支持的Graphics2D
实例。Graphics
传递给AWT或Swing组件的paint()
或paintComponent()
方法的对象通常很好(而来自的对象BufferedImage.get/createGraphics()
则不是)。
我成功使用过这样的代码:
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform xform = AffineTransform.getScaleInstance(.5, .5);
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(image, xform, null); // image being @2x or "retina" size
}
但是,请注意,现代计算机上的字体渲染使用的是“子像素抗锯齿”或“子像素渲染”,这特定于您要渲染到的屏幕设备(请参阅链接,但基本上,RGB模式或“布局”有所不同)从设备到设备)。这意味着BufferedImage
通常不能使用子像素渲染,因此字体看起来不那么清晰。如果要渲染到单个LCD屏幕,则可以指定RenderingHints.TEXT_ANTIALIAS_LCD_*
渲染提示之一以获得更好的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句