2010-11-20 4 views
6

ブラジル政府は、郵便番号の公開APIを持っていないので、私はcorreios.com.brはので、私はOCRプログラムを訓練するために自分の画像を生成することができます下の画像を生成するために使用するコードをリバースエンジニアリングしようとしています。私は今の色に興味はないが、テキストの間隔があるJavaのAWTのフォントの間隔オプション

alt text

:私はすでに右のテキストの間隔と色以外のほとんどすべてを持っていると信じている

alt text

本当に私を悩ます。例えば、ティウカの「Ti」を見てみましょう。 2つの文字は、元の画像では本当に近くにあり、この機能を再現することはできません。私は既にフォントを派生させて、値を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

私は本当にスイングでそれを正しく行う方法を言うことはできませんが、あなたが探しているのは「カーニング」と呼ばれるタイポグラフィーなので、属性は何かと似ています。

+0

もhttp://download.oracle.com/javase/6/docs/api/java/awt/font/TextAttribute.html – trashgod

+0

こんにちはJoltaを参照してください。あなたの提案をありがとう、しかし、私が質問で言ったように、私はすでにカーニングとトラッキングの両方を試みましたが、うまくいきませんでした。 – jbochi