AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Zeichengröße, TrueType, Textmetric
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichengröße, TrueType, Textmetric

Ein Thema von knulli · begonnen am 18. Sep 2006 · letzter Beitrag vom 28. Mai 2013
Antwort Antwort
knulli

Registriert seit: 18. Sep 2006
6 Beiträge
 
#1

Zeichengröße, TrueType, Textmetric

  Alt 18. Sep 2006, 17:08
Hallo,

für eine Anwendung soll die Zeichenhöhe einer Truetypeschrift auf 1/100 mm genau skaliert werden. Dazu soll der Anwender die Größe eines Großbuchstabens ohne Über- und Unterlänge eingeben.

Für einen ersten Versuch habe ich die Textmetric Struktur angewendet und einen Skalierungsfaktor über folgende Formel errechnet:

scaley=tmheight/(tmascent-tminternalleading). Vorher wurde mit Mapmode auf mm_himetric umgeschaltet sowie die API SelectObject mit einem TFontobjekt aufgerufen.

Leider verwirrt mich das Ergebnis bei unterschiedlichen Text-Größen (TFont.Size). Das Verhältnis ist nich konstant - da sich der Charakter der Schrift nicht ändert müsste dieses doch so sein oder?

Hat jemand Erfahrung mit solchen Problemen?

DAnke im voraus.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Zeichengröße, TrueType, Textmetric

  Alt 18. Sep 2006, 18:42
Herzlich willkommen in der Delphi-PRAXiS, knulli.

tmHeight in deiner Formel sollte wohl eher die vom Benutzer geforderte mHeight (Höhe des M) sein. Wenn sich die Verhältniszahl ändert, dann ist das sicherlich ein Faktum und uns bleibt nur die Suche nach einer Erklärung. Hast du schon untersucht, wie sich die Verhältniszahl entwickelt, wenn du statt der Maximalwerte die typographischen Angaben für Ascent (f) und Descent (g) in deiner Formel verwendest?

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
CTest

Registriert seit: 13. Apr 2010
Ort: Gehren
33 Beiträge
 
#3

AW: Zeichengröße, TrueType, Textmetric

  Alt 28. Mai 2013, 13:09
Hallo,

Ich suche auch nach dem Verhältnis Höhe Großbuchstabe: Texthöhe.

Leider komme ich nicht ganz dahinter, aus den Werten der Windows-Textmetric kann ich nicht auf die tatsächliche Höhe schließen.

Beim einfachen Versuch ein Großbuchstaben auf ein Bitmap zu schreiben

Delphi-Quellcode:
  BM := TBitmap.Create;
  try
    AFontname := 'Arial'
    BM.canvas.Font.Name := AFontname;
    BM.canvas.Font.Height := 2000;
    BM.height := 2000;
    BM.width := 1100;
    TextOut(BM.Canvas.Handle, 0, 0, 'E', 1);
    BM.SaveToFile('C:\' + AFontname + '.bmp');
  finally
    BM.Free;
  end;
ist das ausgegebene Zeichen 1282pxl hoch. Oberhalb 339pxl und unten 379pxl Abstand.
Descent stimmt auch mit dem Wert aus der Textmetric überein.
Ascent: 1621
Descent: 379
InternalLeading: 210
ExternalLeading: 59

Auch bei anderen Schriftarten kommen ähnliche Ergenisse zustande. Man erkennt schon einen Zusammenhang von den Leadings und der gesuchten Höhe, aber nichts genaues.
Laut MSDN gibt Internalleading den Freiraum oberhalb an.

Zitat:
Leider verwirrt mich das Ergebnis bei unterschiedlichen Text-Größen (TFont.Size). Das Verhältnis ist nich konstant - da sich der Charakter der Schrift nicht ändert müsste dieses doch so sein oder?
Die nicht konstanten Werte könnten davon kommen, dass in den TrueTypeFonts für unterschiedliche Größen andere Zeichen definiert sind.

Grüße
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Zeichengröße, TrueType, Textmetric

  Alt 28. Mai 2013, 13:54
Am besten ist m.E. nach, wenn der Anwender die Schriftgröße so vorgibt, wie er es gewohnt ist, z.B. mit 14.

Beispiel:

Delphi-Quellcode:
function GetFontHeight(FontSize, Zoom: integer): integer;
begin
  Result := Round(FontSize / 0.0254 * Zoom / 100);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  // MM_HIMETRIC: Each logical unit is mapped to 0.01 millimeter.
  // Positive x is to the right; positive y is up.
  SetMapMode(Canvas.Handle, MM_HIMETRIC);
  Canvas.Font.Height := GetFontHeight(14, 50);
  Canvas.TextOut(1000, -1000, 'Tach');
end;
Gruß
Thomas
  Mit Zitat antworten Zitat
CTest

Registriert seit: 13. Apr 2010
Ort: Gehren
33 Beiträge
 
#5

AW: Zeichengröße, TrueType, Textmetric

  Alt 28. Mai 2013, 14:08
bekomme die Texthöhe aber so vorgegeben, brauche das Verhältnis um auf die 'richtige' Fonthöhe zu rechnen und auch anders rum.

Geändert von CTest (28. Mai 2013 um 14:13 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zeichengröße, TrueType, Textmetric

  Alt 28. Mai 2013, 15:11
Wenn ich mich nicht irre, ist FontSIZE immer auf den Bildschirm bezogen, die printers rechnet die intern um. Du kannst aber auch selbst von MM auf Pixel umrechnen:

Delphi-Quellcode:
function GetScreenLogPixels: integer;
var
  DC: HDC;
begin
  DC := GetDC(0);
  try
    Result := GetDeviceCaps(DC, LOGPIXELSY);
  finally
    ReleaseDC(0, DC);
  end;
end;

function GetPrinterLogPixels: integer; // nach BeginDoc
begin
  Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
end;
  Mit Zitat antworten Zitat
CTest

Registriert seit: 13. Apr 2010
Ort: Gehren
33 Beiträge
 
#7

AW: Zeichengröße, TrueType, Textmetric

  Alt 28. Mai 2013, 15:51
danke, aber das ist nich das, wonach ich suche, evtl. hast du in Post #3 "tatsächliche Höhe" falsch aufgefasst, oder ich habs schlecht formuliert.

Ich möchte z.Bsp. in der Schriftart Arial ein 'A' mit TextOut ausgeben, das selbst 100pxl hoch ist. Dazu brauche ich vorher das Verhältnis Großbuchstabe : Fontsize.
wie im Beispiel oben 1282:2000 = 0,641.
Mit Fontsize 156 sollte dann das Zeichen mit 100pxl Höhe gezeichnet werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz