Zeichenbreite ausrechnen

syfds

Mitglied
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:

Java:
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...

Top Contributor
Ich benutze die Formel:

Java:
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.
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

Top Contributor
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

Top Contributor
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

Mitglied
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:
Java:
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;
 
Zuletzt bearbeitet:

Michael...

Top Contributor
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

Mitglied
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...

Top Contributor
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

Top Contributor
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??
 

Oben