Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Erkennen, ob ein Punkt zu einem Font dazu gehört (https://www.delphipraxis.net/51179-erkennen-ob-ein-punkt-zu-einem-font-dazu-gehoert.html)

BlackJack 7. Aug 2005 22:23


Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Moin
Ich frage mich, ob es eine WinAPI-funktion gibt, die mir im prinzip einen font beschreibt. und zwar würde ich gerne einen 2D-punkt angeben, und die funktion sagt mir, ob der Punkt zum Font dazugehört oder nicht. die angabe der koordinaten sollte dabei am besten im bereich von 0 bis 1 liegen. die funktion soll mir das dann aber aufgrund der den font beschreibenden kurven sagen - was ich also auf keinen fall machen kann ist den Font in ein Bitmap zeichnen zu lassen und dann einfach die pixel zu vergleichen, da dann ja ecken und kanten auftreten werden, die ich gar nicht gebrauchen kann.

ich könnte mich natürlich auch mit dem .ttf-format auseinander setzen und mir selber die kurven und splines raussuchen, die den font beschreiben, allerdings wäre das wahrscheinlich ziemlich kompliziert und eine fertige WinAPI-funktion wäre mir da lieber.

oder kennt jemand eine Komponente oder Klasse die das kann?

danke.

Stanlay Hanks 7. Aug 2005 22:29

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Es gibt keine WinAPI Funktion für OCR oder derartiges.

Man liest sich, Stanlay :hi:

BlackJack 7. Aug 2005 22:42

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Zitat:

Zitat von Stanlay Hanks
Es gibt keine WinAPI Funktion für OCR oder derartiges.

ah, schade. und komponenten kennst du wahrschneinlich auch keine?
ach ja, was genau ist den OCR?

edit: ach ich seh gerade, OCR ist Text-Erkennung, darum geht es mir aber nicht. ich will der funktion sagen wir 2 floats (für x und y), ein zeichen und einen Font angeben, und die funktion sagt mir, ob der punkt zum font gehört oder nicht (also ob er schwarz oder weiss gezeichnet werden müsste). oder war das schon klar geworden?

Stanlay Hanks 7. Aug 2005 22:47

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Hi nochmal. Erläutere doch mal bitte genauer, was du machen möchtest. Ich verstehe das noch nicht ganz.

BlackJack 7. Aug 2005 22:52

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
also.
es geht mir darum herauszufinden, ob eine bestimme 2D-koordinate zu einem zeichen in einem bestimmten Font dazugehört, dann müsste dieser punkt schwarz gezeichnet werden, oder nicht, dann müsste der punkt weiss gezeichnet werden. und das möchte ich eben unabhängig von der größe des Zeichens machen.
ich könnte wie gesagt natürlich den buchstaben in ein TBitmap reinzeichnen, die höhe und breite des bitmaps auf den bereich 0..1 mappen und dann einfach den entsprechenden pixel anschauen, aber das will ich nicht, weil eben durch die pixel-rasterung kanten entstehen.
und es muss auf jeden fall ohne diese kanten gehen, da ja Fonts nicht irgendwie pixelbasiert als Bilder gespeichert werden, sondern es werden die kuven gespeichert, anhand derer sich die zeichen dann zeichnen lassen. die frage ist jetzt halt nur ob ich selber diese kurven berechnen muss oder ob Windows mir dafür routinen zur verfügung stellt.

ich hoffe das ist jetzt klarer geworden.

edit: was ich also im prinzip haben will ist der "Bauplan" eines Zeichens.

xaromz 7. Aug 2005 22:58

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Hallo,

mal doch deinen Buchstaben in einen Path, wandle diesen in eine Region um, und teste dann mit PtInRegion.

Gruß
xaromz

BlackJack 7. Aug 2005 23:02

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Zitat:

Zitat von xaromz
mal doch deinen Buchstaben in einen Path, wandle diesen in eine Region um, und teste dann mit PtInRegion.

ich weiss jetzt nich genau was du mit Path meinst, aber ich denke mal nicht dass das gehen wird, da man beim "malen" ja wieder den "Bauplan" des zeichens in ein pixelbild rastert, und da hat man dann ja wieder kanten drin.

xaromz 7. Aug 2005 23:09

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Hallo,
Zitat:

Zitat von BlackJack
ich weiss jetzt nich genau was du mit Path meinst, aber ich denke mal nicht dass das gehen wird, da man beim "malen" ja wieder den "Bauplan" des zeichens in ein pixelbild rastert, und da hat man dann ja wieder kanten drin.

Ein Path ist eher mit Vektordaten zu vergleichen. Aber wenn Du genaue Ergebnisse haben willst, dann wirst Du das wohl nur über die Glyph-Eigenschaften hinkriegen.

Gruß
xaromz

BlackJack 7. Aug 2005 23:24

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
und was sind diese Glyph-eigenschaften bzw. wie komme ich an die ran?

negaH 7. Aug 2005 23:26

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Zitat:

ch weiss jetzt nich genau was du mit Path meinst, aber ich denke mal nicht dass das gehen wird, da man beim "malen" ja wieder den "Bauplan" des zeichens in ein pixelbild rastert, und da hat man dann ja wieder kanten drin.
Aha. Wie wird denn dein 2D Punkt angegeben ? Als Zahlen ? Als Double Zahlen ? Ach schau an, auf grund ihrer Auflösung haben zb. Ganzzahlige Zahlen wie Integer ebenfalls "Stufen" in Schritten von +-1 drinnen. Auch Double oder jeder beliebige andere Zahlentyp hat "Stufen" bzw- eine Rasterung. Man könnte auch von Fehlern in der maximalen Auflösung reden, wie bei Bitmaps oder auch Vektorzeichnungen.

Es hängt also nur davon ab wie du die Fonts scaliert in einen Path umwandelst. Die daraus erzeugbare Region ist wie auch der Path eine Vektorzeichnung.

Den Vorschlag von xaromz halte ich für absolut richtig, und alles wird vom GDI API unterstützt.

Gruß Hagen

xaromz 7. Aug 2005 23:30

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Hallo,

die Eigenschaften sind genau die Kurven und Linien, mittels derer ein Zeichen gezeichnet wird. Ich kenn mich da jetzt nicht genau aus, aber vielleicht kommst Du da über MSDN-Library durchsuchenGetGlyphOutline ran.

Gruß
xaromz

BlackJack 7. Aug 2005 23:34

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Zitat:

Zitat von negaH
Zitat:

ch weiss jetzt nich genau was du mit Path meinst, aber ich denke mal nicht dass das gehen wird, da man beim "malen" ja wieder den "Bauplan" des zeichens in ein pixelbild rastert, und da hat man dann ja wieder kanten drin.
Aha. Wie wird denn dein 2D Punkt angegeben ? Als Zahlen ? Als Double Zahlen ? Ach schau an, auf grund ihrer Auflösung haben zb. Ganzzahlige Zahlen wie Integer ebenfalls "Stufen" in Schritten von +-1 drinnen. Auch Double oder jeder beliebige andere Zahlentyp hat "Stufen" bzw- eine Rasterung. Man könnte auch von Fehlern in der maximalen Auflösung reden, wie bei Bitmaps oder auch Vektorzeichnungen.

och, bei Doubles mit 300 stellen mach ich mir da nicht so die sorgen.
die koordinaten sollten als Floats angegeben werden.
aber ich denke es dürfte klar sein dass ich nicht kanten durch float-ungenauigkeiten meine, sondern eben die kanten die entstehen wenn man eine pixelgrafik erstellt - ich wusste ja nicht dass es sich bei Paths um Vektorgrafiken handelt. also mal ganz easy.

Zitat:

Zitat von negaH
Es hängt also nur davon ab wie du die Fonts scaliert in einen Path umwandelst. Die daraus erzeugbare Region ist wie auch der Path eine Vektorzeichnung.

Den Vorschlag von xaromz halte ich für absolut richtig, und alles wird vom GDI API unterstützt.

könntet ihr mir dann mal ein beispiel geben, wie man so einen Path benutzt? die Hilfe spuckt da irgendwie nichts richtiges bei aus...

xaromz 7. Aug 2005 23:42

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Zitat:

Zitat von BlackJack
könntet ihr mir dann mal ein beispiel geben, wie man so einen Path benutzt? die Hilfe spuckt da irgendwie nichts richtiges bei aus...

So in etwa:
Delphi-Quellcode:
function IsInChar(C: Char; X, Y: Integer): Boolean;
var
  Region: HRGN;
begin
  BeginPath(Canvas.Handle);
  TextOut(Canvas.Handle, 0, 0, @C, 1);
  EndPath(Canvas.Handle);
  Region := PathToRegion(Canvas.Handle);
  Result := PtInRegion(Region, X, Y);

  DeleteObject(Region);
end;
Du brauchst a) einen Canvas bzw. ein HDC und b) den entsprechenden Font in DC selektiert.

Gruß
xaromz

negaH 7. Aug 2005 23:44

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
Zitat:

och, bei Doubles mit 300 stellen mach ich mir da nicht so die sorgen.
Wie kommst du auf 300 Stellen Genauigkeit ? Suche mal in der Hilfe nach Datentypen -> Double.
Ein Double ist 8 Bytes groß, in 4 Bytes bekommst du ca. 9 dezimale Stellen rein, beim Double beträgt die Genauigkeit gerademal 15-16 Stellen und keine 300.

Paths: Windows SDK Hilfe im Delphi öffenen und nach "Path Functions" suchen. Der Rest sollte damit erklären.

Gruß Hagen

BlackJack 8. Aug 2005 14:30

Re: Erkennen, ob ein Punkt zu einem Font dazu gehört
 
@xaromz: danke für den Code, aber irgendwie bekomme ich damit auch keine runden kurven hin, sondern zu wieder pixelmäßig gerasterte. kannst ja mal selber diesen Beispielcode testen:
Delphi-Quellcode:
function TForm1.IsInChar(C: Char; X, Y: Double): Boolean;
var
  Region: HRGN;
begin
  BeginPath(Canvas.Handle);
  TextOut(Canvas.Handle, 0, 0, @C, 1);
  EndPath(Canvas.Handle);
  Region := PathToRegion(Canvas.Handle);
  Result := PtInRegion(Region, Trunc(X*Canvas.TextWidth(C)), Trunc(Y*Canvas.TextHeight(C)));

  DeleteObject(Region);
end;

procedure TForm1.Button1Click(Sender: TObject);
var x, y: Integer;
begin
  for y := 0 to ClientHeight-1 do
    for x := 0 to ClientWidth-1 do
      if IsInChar('A', x/ClientWidth, y/ClientHeight) then
        Canvas.Pixels[x,y] := clBlack
      else
        Canvas.Pixels[x,y] := clWhite;
end;
mich würde eher dieses GetGlyphOutline interessieren, damit kann ich mir ja die splines holen. wenn ich dann aber PtInRegion benutze, muss ich ja immer einen Canvas angeben, in den die Splines gezeichnet werden müssen, und schon habe ich wieder die gleichen kanten wie oben in dem code. bleibt mir da also nicht anderes übrig, als selber die splines zu untersuchen, oder gibt es auch Region-funtionen, die direkt mit den Splines arbeiten, ohne diese zu zeichnen? (hab da bisher nichts in der Richtung entdeckt).

oder ginge soetwas mit den Path-functions? bei denen habe ich allerdings nirgendwo so etwas wie PtInside oder so entdecken können.

@negaH:
ok, 300 stellen genauigkeit hat man nicht immer, das ist klar. aber lass uns diese diskussion hier beenden, das bringt nichts. wie gesagt, mir geht es darum Float-koordianten anzugeben (wie ich sie ja auch bei Path-functions haben müsste?)

edit: noch ne frage: wie kann ich eigentlich diese Path-functions dann letztendlich nutzen? so wie ich das in der Hilfe sehe ist das doch ne C++-Klasse, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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