如何在高质量的bufferedImage中渲染小的utf字体

时间:2016-05-15 12:14:53

标签: java text rendering

我想在bufferedImage中使用java渲染字符串。问题是当我使用小字体(例如:8pt)时,我的图像质量很差,图像分辨率为72dpi。 我想拥有最佳的图像质量,如果可能的话,将图像分辨率更改为360dpi。 注意到我想生成一个包含不同字体,字体大小和字体样式的语言单词数据库。我使用标准的Java API(Graphics2D,Font,RenderingHints,FontMetrics,...)来生成图像。 这是我的代码:

public static void main(String[] args) {
    String text = "ⴰⴱⴱⵓⵥⵥⵍ";
    String [] polices=polices();
    for(int i=0;i<polices.length;i++){
        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D g2d = img.createGraphics();
        Font font = new Font(polices[i], Font.PLAIN, 8);
        g2d.setFont(font);
        FontMetrics fm = g2d.getFontMetrics();
        int width = fm.stringWidth(text);
        int height = fm.getHeight();
        g2d.dispose();
        img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        g2d = img.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(font);
        g2d.setBackground(Color.WHITE);
        g2d.clearRect(0, 0, width, height);
        fm = g2d.getFontMetrics();
        g2d.setColor(Color.BLACK);
        g2d.drawString(text, 0, fm.getAscent());
        g2d.dispose();
        try {
            ImageIO.write(img, "png", new File("Text "+i+".png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

我徒劳地搜索了一个解决方案,如果有人可以帮助我,我会感激不尽。 也欢迎使用任何externe库的解决方案。

1 个答案:

答案 0 :(得分:0)

72dpi的8pt字体是8/72 * 360 = 360dpi的40号字体 - 所以将字体大小设置为40.

关于如何设置图像的DPI,请参阅问题How to set DPI information in an image?