如何在 Java 中创建自定义高清图像
How to create custom high-def images in Java
我正在 Java 中创建带有透明背景字体的图像。我使字体具有不同的颜色和不同类型的字体样式,因此我需要程序是动态的。问题是我正在使用 Graphics2D 并使用 g2d.drawString() 在缓冲图像上书写,而图像几乎不是我正在寻找的定义。我试过用大字体创建大图像,然后缩小尺寸,但这也不起作用。我还将所有可能的 RenderingHints 设置为最高清晰度。我希望像素密度足够高,如果将它与视网膜屏幕上的常规文本进行比较,则不会有太大差异。谢谢
要在 Java 中获得 "retina" 质量图像,您必须创建并渲染 BufferedImage
两个维度中正常大小的 2 倍(这将使图像成为 4 倍大,我认为这是@MadProgrammer 的意思)。
然后,您必须 而不是 对 Java 中的图像进行缩减采样(或 "scale"),而是保持 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
}
但是请注意,现代计算机上的字体渲染使用 "sub pixel antialiasing" or "sub pixel rendering", which is specific to the screen device you are rendering to (see the link, but basically, the RGB pattern or "layout" differs from device to device). This means a BufferedImage
usually can't use sub pixel rendering, and thus fonts will look less crisp. If you are rendering to a single LCD screen, you might be able to specify one of the RenderingHints.TEXT_ANTIALIAS_LCD_*
渲染提示以获得更好的效果。
我正在 Java 中创建带有透明背景字体的图像。我使字体具有不同的颜色和不同类型的字体样式,因此我需要程序是动态的。问题是我正在使用 Graphics2D 并使用 g2d.drawString() 在缓冲图像上书写,而图像几乎不是我正在寻找的定义。我试过用大字体创建大图像,然后缩小尺寸,但这也不起作用。我还将所有可能的 RenderingHints 设置为最高清晰度。我希望像素密度足够高,如果将它与视网膜屏幕上的常规文本进行比较,则不会有太大差异。谢谢
要在 Java 中获得 "retina" 质量图像,您必须创建并渲染 BufferedImage
两个维度中正常大小的 2 倍(这将使图像成为 4 倍大,我认为这是@MadProgrammer 的意思)。
然后,您必须 而不是 对 Java 中的图像进行缩减采样(或 "scale"),而是保持 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
}
但是请注意,现代计算机上的字体渲染使用 "sub pixel antialiasing" or "sub pixel rendering", which is specific to the screen device you are rendering to (see the link, but basically, the RGB pattern or "layout" differs from device to device). This means a BufferedImage
usually can't use sub pixel rendering, and thus fonts will look less crisp. If you are rendering to a single LCD screen, you might be able to specify one of the RenderingHints.TEXT_ANTIALIAS_LCD_*
渲染提示以获得更好的效果。