2010-11-20 108 views
6

因爲巴西政府不具備郵政編碼公共API,我試圖逆向工程是correios.com.br用來生成圖像的下方,所以我可以生成自己的圖像來訓練OCR程序代碼。的Java AWT的字體間距選項

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."); 
    } 

} 

我的問題是:什麼是其他選項來控制,當它繪製的字符串是如何分開?你對原始代碼可能在做什麼有什麼想法嗎?

謝謝!

回答

2

我真的不能說如何在Swing中正確地做到這一點,但是你在尋找的是所謂的「kerning」,所以屬性應該做類似的東西。

+0

參見http://download.oracle.com/javase/6/docs/api/java/awt/font/TextAttribute.html – trashgod 2010-11-20 17:47:13

+0

嗨Jolta。感謝您的建議,但正如我在問題中所說的那樣,我已經嘗試了Kerning和Tracking,但它沒有奏效。 – jbochi 2010-11-20 20:24:10