我在Java中创建了具有透明背景的字体。我使字体有不同的颜色和不同类型的字体样式,所以我需要程序是动态的。问题是我正在使用Graphics2D并使用g2d.drawString()在Buffered Image上编写,而且图像几乎不是我正在寻找的定义。我尝试过创建大字体大图像然后缩小尺寸,但这也不起作用。我还将所有可能的RenderingHints设置为最高清晰度。我希望像素密度足够高,以至于如果将它与视网膜屏幕上的常规文本进行比较,则没有多大区别。感谢。
答案 0 :(得分:2)
要在Java中使用“视网膜”质量图像,您必须在两个维度上创建并渲染BufferedImage
正常大小的2倍(这将使图像大4倍,我认为是@ MadProgrammer意味着)。
然后,您必须不在Java中缩小(或“缩放”)图像,而是将BufferedImage
保持为完整大小,并且只将图像的大小绘制为一半本机支持的Graphics2D
实例。传递给AWT或Swing组件的Graphics
或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
}
但请注意,现代计算机上的字体渲染使用"sub pixel antialiasing" or "sub pixel rendering",这是您要渲染的屏幕设备所特有的(请参阅链接,但基本上,RGB模式或“布局”因设备而异)设备)。这意味着BufferedImage
通常不能使用子像素渲染,因此字体看起来不那么清晰。如果您要渲染到单个LCD屏幕,则可以指定一个RenderingHints.TEXT_ANTIALIAS_LCD_*
渲染提示以获得更好的结果。