Java awt 字体间距选项

标签 java image fonts awt

由于巴西政府没有邮政编码的公共(public) API,我正试图对 correios.com.br 的代码进行逆向工程。用于生成下面的图像,因此我可以生成自己的图像来训练 OCR 程序。

alt text

我相信除了文本间距和颜色之外,我几乎已经掌握了所有内容:

alt text

我现在对颜色不感兴趣,但文字间距真的让我很困扰。例如,看看“Tijuca”中的“Ti”。这两个字母在原始图像中非常靠近,我无法重现此功能。我已经尝试派生字体,将值设置为 TextAttribute.TRACKINGTextAttribute.KERNING,但没有成功。

下面是我的代码:

import java.awt.Color;
import java.awt.font.TextAttribute;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;

public class CreateImage {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int width = 570;
        int height = 120;
        boolean new_image = true;

        BufferedImage img;       

        if (!new_image) {
            try {
                img = ImageIO.read(new File("original.jpg"));                           
            } catch (IOException e) {
                e.printStackTrace();            
                new_image = true;
                img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            }
        } else {
            img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);         
        }

        Graphics2D g2d = img.createGraphics();
        if (new_image) {
            // white background
            g2d.setPaint(Color.WHITE);
            g2d.fillRect(0, 0, width, height);

            g2d.setPaint(Color.BLACK);
        } else {
            g2d.setPaint(Color.RED);
        }


        Font myfont = new Font("SansSerif", Font.BOLD, 11);      

        /*
        Hashtable<TextAttribute, Float> attributes = new Hashtable<TextAttribute, Float>();
        attributes.put(TextAttribute.TRACKING, new Float(-0.01));
        myfont = myfont.deriveFont(attributes);
        */

        g2d.setFont(myfont);

        g2d.drawString("Logradouro:", 5, 13);
        g2d.drawString("Bairro:", 5, 33);
        g2d.drawString("Localidade / UF:", 5, 53);
        g2d.drawString("CEP:", 5, 73);

        g2d.drawString("Avenida das Américas - de 3979 a 5151 - lado ímpar", 105, 13);
        g2d.drawString("Barra da Tijuca", 105, 33);
        g2d.drawString("Rio de Janeiro/RJ", 105, 53);
        g2d.drawString("22631-004", 105, 73);

        g2d.dispose();      

        File file = new File("clone.jpg");
        try {
            ImageIO.write(img, "jpg", file);

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("clone.jpg file created.");
    }

}

我的问题是:还有哪些其他选项可以控制绘制字符串时的间距?您对原始代码的作用有什么想法吗?

谢谢!

最佳答案

我真的不能说如何在 Swing 中正确地做到这一点,但你正在寻找的是一种叫做“kerning”的排版,因此该属性应该做某事类似的事情。

关于Java awt 字体间距选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233352/

相关文章:

java - Hibernate 在 EntityTuplizerFactory.constructTuplizer 中失败并出现 NullPointerException?为什么?

java - 递归方法查找数字中出现的次数

image - uint8函数有什么作用?

JavaFX 2.2 字体渲染有问题

css - 偶尔的 CSS 谷歌字体损坏?

java - NetBeans 在 JSP 中的 src ="<%=request.getContextPath()%>/images/image.png"中报告错误

java - JTable 行中的重复值

java - 如何根据计时器移动图像?

Java 2D ImageIO.Write 阻碍性能

fonts - 织物 Js : How to get list of default supported fontFamily?