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



我正在用Java创建图像,这些图像上写着透明背景的字体。我让字体有不同的颜色,也有不同类型的字体样式,所以我需要程序是动态的。问题是,我正在使用Graphics2D,并使用g2d.drawString()在缓冲图像上进行编写,但图像并不是我想要的定义。我试过用大字体创建大图像,然后缩小尺寸,但这也不起作用。我还将所有可能的RenderingHints设置为最高定义。我希望像素密度足够高,如果你将其与视网膜屏幕上的常规文本进行比较,不会有太大差异。谢谢

要在Java中获得"retina"质量的图像,必须在两个维度上以正常大小的2倍创建并渲染BufferedImage(这将使图像变大4倍,我认为这就是@MadProgrammer的意思)。

然后,您必须不要在Java中对图像进行下采样(或"缩放"),而是保持BufferedImage的全尺寸,并且只将图像绘制为本机支持的Graphics2D实例的一半尺寸。传递给AWT或Swing组件的paint()paintComponent()方法的Graphics对象通常很好(而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_*渲染提示之一以获得更好的结果。

最新更新