2013-07-09 38 views
0

我需要創建一個以像素爲單位的字體大小的字體。如何在Java中將字體調整爲像素大小?如何將像素轉換爲點?

Java的Font類的構造函數需要以點表示的字體大小。點是物理長度,而像素是數字化的。所以我需要dpi

手冊中說這個值包含在FontRenderContext.getTransform()的內部。

我發現,在我的情況下,縮放是一個,即像素=點。

不幸的是,創建大小爲100的字體會創建更大的圖像。

例如,下面

BufferedImage ans = new BufferedImage(width, height, imageType); 
    Font font = new Font(fontName,fontStyle,height); 

    Graphics2D g2 = ans.createGraphics(); 

    g2.setFont(font); 

    FontMetrics fm = g2.getFontMetrics(); 
    FontRenderContext frc = g2.getFontRenderContext(); 

    System.out.println("height=" + height); 
    System.out.println("frc.getTransform()=" +frc.getTransform()); 
    System.out.println("g2.getTransform()=" +g2.getTransform()); 
    System.out.println("fm.getAscent()+fm.getDescent()="+fm.getAscent()+"+"+fm.getDescent()+"="+(fm.getAscent()+fm.getDescent())); 


    g2.drawString(str, 0, fm.getAscent()); 

代碼給出

height=100 
frc.getTransform()=AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]] 
g2.getTransform()=AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]] 
fm.getAscent()+fm.getDescent()=93+20=113 

如何適應?

+0

這裏有72點。臺式電腦顯示器一般爲96像素到英寸。你可以調用Toolkit.getDefaultToolkit()。getScreenResolution();以每英寸像素爲單位獲得屏幕分辨率。 –

+0

在我的情況下,分辨率是每個點1個像素(請參閱轉換對象)。或者你的意思是屏幕分辨率在這裏扮演角色,即使我不使用屏幕? –

回答

1

我使用此代碼來確定繪製字符串時字符串的大小(以像素爲單位)。

x和y計算在繪圖區域中居中字符串。 y的計算看起來很奇怪,因爲y原點位於左下角,而不是左上角。

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    if (font == null) { 
     return; 
    } 

    Graphics2D g2d = (Graphics2D) g; 
    FontRenderContext frc = g2d.getFontRenderContext(); 
    TextLayout layout = new TextLayout(sampleString, font, frc); 
    Rectangle2D bounds = layout.getBounds(); 

    int width = (int) Math.round(bounds.getWidth()); 
    int height = (int) Math.round(bounds.getHeight()); 
    int x = (getWidth() - width)/2; 
    int y = height + (getHeight() - height)/2; 

    layout.draw(g2d, (float) x, (float) y); 
} 
+0

這看起來是相反的任務。我需要創建正確的'字體'實例知道像素大小。 –

+0

@Suzan Cioc:將上面的代碼放在循環中。以72像素的字體開始,然後遞減2,直到文字適合您的像素區域。 –

相關問題