# Zeichenbreite ausrechnen



## syfds (7. Aug 2012)

Hallo an alle,
ich habe folgendes Problem: ich möchte die Zeichenbreite in px ausrechnen, z.B. die Breite des Zeichens “0“. Ich benutze die Formel:


```
float charWidth = FontMetrics.charWidth(“0“) * DPI / 72;  // 72 – java standard
```

Nicht bei allen DPI Größen, die ich getestet habe, bekomme ich ein richtiges Ergebnis. Die Breiten in px brauche bei der Berechnung von Koordinaten für die Erstellung von Excel Dateien mit Apache POI Bibliothek. Die Koordinaten brauche ich, um ein Bild in der Tabelle in der originalen Größe zu platzieren. Sonst wird das Bild gestreckt und die Seitenverhältnisse geändert, um dies zu vermeiden möchste ich exakte Koordinaten ausrechnen, und dazu brauche ich die Zeichenbreiten. Hier genauer: link.

Meine Frage wäre nur, ob ich richtig vorgehe und ob es andere Methoden gibt, Zeichenbreite auszurechnen? Für jede Hilfe bedanke ich mich im Voraus!


----------



## Michael... (7. Aug 2012)

syfds hat gesagt.:


> Ich benutze die Formel:
> 
> 
> ```
> ...


Das heißt bzw. welche Ergebnisse kommen denn?  Die einzige Variable in der Formel ist DPI
Wie schaut denn der echte Code für die Formel aus?


----------



## bERt0r (7. Aug 2012)

Also dein Code funktioniert schonmal nicht weil FontMetrics keine statischen Funktionen hat. Rechnest du überhaupt mit den FontMetrics der richtigen Font? Und zurückliefern sollte dir die Methode eigentlich schnon die Breite in Pixel, afaik zumindest.


----------



## Marco13 (7. Aug 2012)

bERt0r hat gesagt.:


> Also dein Code funktioniert schonmal nicht weil FontMetrics keine statischen Funktionen hat.



FontMetrics FontMetrics = obtainThemFromSomewhere(); :joke: 


Von welchen Größenordnungen ist denn hier die Rede? Geht es vielleicht nur um einzelne Pixel? Das könnte vielleicht mit einem
float charWidth = *(float)*FontMetrics.charWidth(“0“) * DPI / 72;  // 72 – java standard
schon behoben sein. Ansonsten ... kann es aber immer mal sein, dass solche Angaben nicht stimmen. Fonts sind viel (viel VIEL VIEL!) komplizierter, als sie so auf dem Bildschirm immer aussehen


----------



## syfds (8. Aug 2012)

Danke euch allen für die schnellen Antworten. 

@Marco danke für den Vorschlag, das Problem ist, dass die Berechnung stimmt. Die habe ich bei mehreren DPI Größen getestet. Nur bei manchen bekomme ich einen 20% Fehler, z.B. ich bekomme 5 px als Zeichenbreite, in wirklichkeit sind es 6 px. 

@Michael mein Code schaut so aus:

```
int dpi = Toolkit.getDefaultToolkit().getScreenResolution();

// get font metrics, 
FontMetrics fontMetrics = new JLabel().getFontMetrics(getMyFont());

// get char width
float fontWidth = fontMetrics.charWidth('0');

fontWidth = (float)fontWidth * (float)dpi/ 72;
```


----------



## Michael... (8. Aug 2012)

Wenn Du sowieso mit float Variablen arbeitest kannst Du Dir das Casten sparen.
Ich behaupte mal, dass bei der Berechnung keine Ganzzahligen Werte rauskommen und bei 5px vs 6px hier auch ein "Rundungsfehler" in Frage kommt. Wie kommst Du auf die Pixel?

Gib mal ein paar Beispiele oder Democode. Welchen Wert liefert charWidth bei welchen dpi Werten bekommst Du welche Pixelwerte.


----------



## syfds (8. Aug 2012)

charwidth,		dpi,		px
4,		             96,		5,33 (an der Stelle runde ich auf 5 ab)
3,		             120,		5,00 (an der Stelle runde ich auf 5 ab) hier Fehler20%!
3,		             122,		5,0833 (an der Stelle runde ich auf 5 ab)
3,		             144,		6,00 (an der Stelle runde ich auf 6 ab)


----------



## Michael... (8. Aug 2012)

syfds hat gesagt.:


> 3,		             120,		5,00 (an der Stelle runde ich auf 5 ab) hier Fehler20%!
> 3,		             122,		5,0833 (an der Stelle runde ich auf 5 ab)


die erste Zeile ist falsch und die zweite nicht? Ist das immer für den selben Buchstaben? Änderst Du zwischendurch den Font?


----------



## syfds (8. Aug 2012)

der Font wird nicht geändert. Es ist immer derselbe Buchstabe ('0').


----------



## Michael... (8. Aug 2012)

syfds hat gesagt.:


> der Font wird nicht geändert. Es ist immer derselbe Buchstabe ('0').


Das würde ja bedeuten, dass die Methode charWidth() für den selben Buchstaben bei gleichem Font unterschiedliche Werte liefert. Das kann ich mir allerdings nur schwer vorstellen...
Welchen Font verwendest Du und kannst Du dazu mal auführbaren Bsp Code posten der solche Ausgaben liefert.


----------



## Mujahiddin (8. Aug 2012)

3*120 / 72 = 5,00
Sagt mir mein Taschenrechner genauso.
Wieso soll das ein 20%-Fehler sein?

Und übrigens, spricht man von "ab"-runden, wenn es sich beim double bereits um einen int handelt??


----------

