如何在Java中创建自定义高清图像

时间:2015-04-28 23:45:46

标签: java bufferedimage graphics2d

我在Java中创建了具有透明背景的字体。我使字体有不同的颜色和不同类型的字体样式,所以我需要程序是动态的。问题是我正在使用Graphics2D并使用g2d.drawString()在Buffered Image上编写,而且图像几乎不是我正在寻找的定义。我尝试过创建大字体大图像然后缩小尺寸,但这也不起作用。我还将所有可能的RenderingHints设置为最高清晰度。我希望像素密度足够高,以至于如果将它与视网膜屏幕上的常规文本进行比较,则没有多大区别。感谢。

1 个答案:

答案 0 :(得分:2)

要在Java中使用“视网膜”质量图像,您必须在两个维度上创建并渲染BufferedImage正常大小的2倍(这将使图像大4倍,我认为是@ MadProgrammer意味着)。

然后,您必须在Java中缩小(或“缩放”)图像,而是将BufferedImage保持为完整大小,并且只将图像的大小绘制为一半本机支持的Graphics2D实例。传递给AWT或Swing组件的Graphicspaint()方法的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_*渲染提示以获得更好的结果。