Position von Buchstaben bestimmen

  • Danke für deine Antwort.

    Ich möchte nicht nur die Größe des Strings berechnen. Ich brauche auch Position und Breite jedes char in dem String.

    Der Hintergrund ist, dass ich selbst eine Linewrap-Funktion schreiben muss.


    Viele Grüße

    Sascha

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von sashs ()

  • Hallo,
    @MCDan
    Vielen Dank. Kannte ich noch nicht, aber das kann ich leider nicht nutzen.


    Also ich brauche definitiv die Position der einzelnen Buchstaben, unabhängig vom Zeilenumbruch.
    Habe die Funktion
    developer.apple.com/library/ma…/Reference/reference.html
    gefunden.
    Wenn ich das richtig verstanden habe, wäre das eine Funktion die ich nutzen könnte. Allerdings verstehe ich die Werte nicht die dort rauskommen.

    Quellcode

    1. glyphs[0] = 'A';
    2. glyphs[1] = 'O';
    3. glyphs[2] = 'o';
    4. glyphs[3] = 'l';
    5. glyphs[4] = 'y';

    Quellcode

    1. x: 54.000000,y: 690.000000,width: 853.000000,height: 801.000000
    2. x: 131.000000,y: 0.000000,width: 180.000000,height: 1466.000000
    3. x: 80.000000,y: -401.000000,width: 925.000000,height: 1487.000000
    4. x: 74.000000,y: -24.000000,width: 978.000000,height: 1499.000000
    5. x: 68.000000,y: -24.000000,width: 995.000000,height: 1498.000000


    Die nächste Frage wäre noch, wie ich davon auf die Breite und die Höhe bei einer bestimmten Schriftgröße komme.

    Viele Grüße

    Sascha

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von sashs ()

  • die werte werden wohl mit UnitsPerEm zusammenhängen.

    aber wenn du uns nicht sagst was du machen willst ist schwer zu helfen.

    CGFont ist aber eher das falsche.
    wenn du CoreText verwendest und dir dann eine CTLine erstellst, daraus die CTRuns holst bekommst du auch die positionen der einzelnen glyphs. und das sind dann die korrekten glyphen: aus "Fiffi"" werden also keine 5 glyphen verwendet werden sondern abhängig von verwendeten und vorhandenen ligaturen nur weniger.
  • Vielen Dank für eure Antworten.

    Was ich machen will ist ganz einfach. ;)
    Ich will eine Funktion schreiben, der ich einen String und eine Font (Schriftart und Größe) gebe. Diese soll dann ein Array mit den pixelgenauen Positionen in dem String und die Breite jedes einzelnen Buchstabens abhängig zu dem übergebenen Font zurückgeben.

    Da die Verwendung dieser Funktion beliebig ist. Es ist halt wichtig, dass ich diese Funktion habe. Ich habe leider nur keine Ahnung wie ich das angehen kann.

    Viele Grüße

    Sascha
  • Ich sagte ja für verschiedene Einsatszwecke.
    Ich verstehe allerdings nicht, warum es wichtig ist, wozu ich es brauche.

    Ich brauche halt diese Möglichkeit.
    Wozu kann doch eigentlich ganz egal sein, oder nicht? Ich möchte nicht wissen, wie ich das wozu ich diese Funktion brauche anders erledigen kann.

    Wenn du jemanden fragst wie du die Bremsen am Auto selbst wechseln kannst, wirst du ja auch nicht gefragt, wozu du das Auto brauchst, weil du dafür ja vielleicht kein Auto brauchst. ;)

    Viele Grüße

    Sascha
  • Bei Mac OS X ist das Setzen von Schrift eine außerordentlich komplexe Angelegenheit. Nicht umsonst gibt es das seit Uhrzeiten auf Macs. Damals war Fettschrift auf PCs noch nicht fett, sondern grün.

    Wenn du das vorherberechnen möchtest, musst du im Prinzip das Textsystem von OS X nachbauen. Das ist nicht lustig. Wenn du Text auf bestimmte Weise ausgeben willst, gibt es dafür APIs, die immer mehr vom einfachen zum komplexeren Fall skalieren, das heißt, du kannst sehr schnell gute Resultate erzielen, die du immer weiter verbessern kannst.

    Deshalb ist die Frage wichtig. Aber du beantwortest sie ja nicht, warum auch immer.

    Wie dem auch sei, dann willst du es eben selbst machen. CoreText wurde dir genannt. Lies dazu die Dokumentation und melde dich danach wieder. Also in etwa einer Woche.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • außerdem verhält sich das textsystem mit jeder systemversion wieder etwas anders weil es immer dazulernt (opentype features zb).

    bei deiner berechnung ist auch kerning interessant. also ob das eingeschaltet sein soll oder deaktiviert. das hängt eben ganz davon ab was dein ziel ist.
  • Es ist doch ganz egal wozu ich es brauche.

    Ich will keine alternative Lösung haben. Ich brauche es so, weil es eine Vorgabe ist. Ich verstehe die Diskussion nicht. Warum muss man erklären wozu man etwas braucht? Es wird schon einen Grund haben.

    Wie gesagt, wenn du jemanden fragst, wie du die Bremsen an deinem Auto wechselst, wirst du auch nicht gefragt, wozu du dein Auto brauchst, weil du ja vielleicht die Wege anders zurücklegen kannst.
    Wenn jemand sagt, dass es nicht möglich ist, ist es ja ok.
    Dass es vielleicht mit CoreText umsetzbar ist, ist mir schon bewusst. Das war es auch schon bevor ich die Frage gestellt hatte.
    Da ich aber keine Anhalt hatte und das Framework schon etwas komplexer ist , dachte ich mir, dass ein mal nachfrage, vielleicht hat jemand sowas in der Richtung schon mal gemacht oder weiß zumindest was ich mir mal anschauen könnte, was etwas konkreter ist als CoreText.



    Viele Grüße

    Sascha
  • wie gesagt kannst du das mit CTLine und CTRun machen.

    aber um zu wissen was wir dir antworten brauchen wir eben mehr informationen.
    denn der abstand von zwei verschiedenen zeichen (die sogar nur ein zeichen sein können (ligaturen)) hängt von einigen faktoren ab (kerning, tracking) und deshalb kann man keine generelle antwort geben.
  • Mit den Buchstaben selbst, möchte ich nichts machen. Diese sind schon irgendwo irgendwie gezeichnet worden. Ich brauche halt nur die Position und die Breite der Buchstaben. Da es aber keine cocoa-GUI-Komponenten sind, brauche ich diese Angaben unabhängig vom GUI-Element.

    Ich möchte auch nichts an der Größe verändern oder ähnliches. Ich hab halt eine Schriftart und eine Größe und den String. Also muss das ganze mit allen Schriftarten, die auf dem System installiert sind, funktionieren.

    Viele Grüße

    Sascha
  • sashs schrieb:

    Mit den Buchstaben selbst, möchte ich nichts machen. Diese sind schon irgendwo irgendwie gezeichnet worden. Ich brauche halt nur die Position und die Breite der Buchstaben. Da es aber keine cocoa-GUI-Komponenten sind, brauche ich diese Angaben unabhängig vom GUI-Element.

    Ich möchte auch nichts an der Größe verändern oder ähnliches. Ich hab halt eine Schriftart und eine Größe und den String. Also muss das ganze mit allen Schriftarten, die auf dem System installiert sind, funktionieren.

    Viele Grüße

    Sascha


    dann musst du aber wissen wie der text gezeichnet wurde: kerning, tracking, opentype-features, automatische ersetzung von fehlenden zeichen etc.
    sonst kann es in vielen fällen vorkommen dass du KOMPLETT andere positionen erhällst. nur als bei spiel wenn der text so lautet: "Das Glas ist 1/2 voll", dann kann zb das 1/2 drei zeichen sein oder eben auch ein einziges zeichen ½ welches von den maßen, abständen etc komplett anders ist. außerdem hast du einmal 3 positionen und bei der anderen methode nur 1...
  • Was gritsch dir versucht zu sagen ist, dass es eine solche Funktion nicht geben kann. Du kannst nicht sagen ein String mit dem Font sieht gezeichnet so aus. Lies dich mal in die freetypelib ein. Dann wirst du kapieren das dein Vorhaben nicht machbar ist. Fertig.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)