Pfad aus dem Text-HTML-Canvas extrahieren

8

Gibt es trotzdem einen Weg, um einen Pfad aus einem oder mehreren Buchstaben in html 5 zu extrahieren, dann greifen Sie (x, y) Koordinaten entlang des Pfades, so dass die Buchstaben durch Kreise entlang des Pfades gebildet werden können ?

Ich möchte die x, y-Koordinaten nehmen und eine Form an ihrer Position anwenden, so dass sie der Textfolge in einem "pixeligen" Format gefolgt von einigen animierenden Effekten ähnelt.

Jeder Tipp, wie man x-y-Koordinaten entlang eines Pfades von Zeichen auf einer Leinwand erhält, wäre großartig.

edit: Ich versuche im Wesentlichen, die Koordinaten automatisch zu generieren, um etwas ähnliches zu tun: Ссылка

    
user813611 03.10.2012, 01:22
quelle

2 Antworten

10

Pixel-Skalierung

Ein einfacher Ansatz hierfür ist Folgendes:

  • Verwenden Sie eine kleine Schrift, zeichnen Sie den Text mit einer Volltonfarbe
  • Iteriere alle Pixel. Jedes Pixel mit Alpha = 255 speichert ein Array, wobei x und y mit dem Durchmesser
  • skaliert sind

Jetzt haben Sie eine grobe Reihe von "Bällen", die den Text darstellen und animiert werden können. Es ist nicht sehr genau, wenn es um Briefabstand geht, aber es sollte für den gegebenen Zweck tun (Sie könnten immer jeden Buchstaben messen und an der Trennstelle erhöhen Sie den Wert für Ende x mit einem zusätzlichen Delta-Wert).

Eine größere Schriftgröße kann die Qualität verbessern, erzeugt aber auch mehr Punkte. Eine andere Schriftart als die in der folgenden Demo verwendete Schriftart kann auch für das Gesamtbild von Nutzen sein (Experiment!). Sie können den Alpha-Schwellenwert auch so anpassen, dass er Pixel enthält, die nicht vollständig, aber einflussreich sind.

Und schließlich, verschiedene Browser rendern Text anders, so dass Sie dies auch im Sinn haben sollten (siehe oben über die Messung jedes Buchstaben, um zusätzlichen Abstand zwischen ihnen hinzuzufügen).

Demo

%Vor% %Vor% %Vor%
    
K3N 13.05.2015 02:47
quelle
8

Dies ist eine schwierige Aufgabe, die manuell erledigt werden kann, indem Kreise entlang des Pfades eines Buchstabens visuell platziert werden.

Es ist sogar noch schwerer automatisch (automatisch!) ohne menschliche Intervention.

So ordnen Sie Kreise automatisch an, um Buchstaben zu bilden.

Die Antwort besteht aus zwei Teilen ...

  1. Suchen der "Buchstabenform",

  2. Erstellen von Kreisen zum Füllen und Umriss der Buchstabenform.

1. Der schwierige Teil

Frederik De Bleser hat eine schöne Bibliothek namens opentype.js programmiert, die eine .ttf-Schriftartdatei verwendet und die Glyphenumrandung eines bestimmten Zeichens mit quadratischen Kurven auf einer Zeichenfläche analysiert: Ссылка

2. Der einzige etwas weniger harte Teil

Für jeden Buchstaben:

  • Finde "viele" Punkte auf jeder quadratischen Kurve. Hier ist der Algorithmus zum Berechnen eines [x, y] auf der Kurve in einem Intervall T. T liegt im Bereich von 0,00 am Anfang der Kurve bis 1,00 am Ende der Kurve. T erzeugt keine gleichmäßig verteilten [x, y] -Werte entlang der Kurve, so dass Sie eine Überabtastung durchführen müssen (So kann "viele" 1000 Werte von T zwischen 0,00 und 1,00 bedeuten).

    %Vor%
  • Bestimmen Sie den Winkel, der den Winkel der Kurve an diesen Punkten berührt. (Grundsätzlich berechnen, was wäre ein rechter Winkel zur Kurve). Sie können das mit der nächsten Ableitung der quadratischen Formel tun:

    %Vor%
  • Berechnen Sie ausgehend vom Anfang der Kurve jeden Abstand vom aktuellen [x, y] zum nächsten [x, y]. Sie können dies mit dem Satz des Pythagoras tun:

    %Vor%
  • Dekomprimieren Sie das Array so, dass alle verbleibenden [x, y] -Elemente 1px vom vorherigen [x, y] -Element entfernt sind. Sie können dies tun, indem Sie ein zweites Array mit Werten aus dem ersten füllen, in dem parseInt( nextInOriginalArray - lastDistanceInNewArray)==1;

  • steht
  • Entscheiden Sie sich für einen Radius für Ihre Kreise, aus denen sich jeder Buchstabe zusammensetzt. Das ist tatsächlich schwieriger als es scheint. Für "blocky" -Schriften können Sie den Buchstaben "I" auf der Leinwand zeichnen. Dann hole alle Pixel mit getImageData . Berechnen Sie die Breite des vertikalen Strichs des "I", indem Sie nach der Anzahl der undurchsichtigen Pixel suchen, die horizontal in der vertikalen Mitte des Buchstabens verlaufen. Für blockige Schriftarten var radius = horizontalOpaquePixelCount/2; . Bei Schriftarten mit Strichen variabler Breite müssen Sie erfinderisch sein. Vielleicht var radius = horizontalOpaquePixelCount/3; oder var radius = horizontalOpaquePixelCount/4; .

  • Iteriere durch das Punkte-Array und definiere einen neuen Kreis für jedes radius*2 Pixel. Sie berechnen den Mittelpunkt für jeden Kreis mit dem Tangentenwinkel und der Trigonometrie wie folgt:

    %Vor%
  • Beim Kreieren von Kreisen kehren sich die Kurven des Buchstabens irgendwann in sich selbst zurück. Daher müssen Sie jeden neu erstellten Kreis überprüfen, um sicherzustellen, dass er sich nicht mit einem vorhandenen Kreis überschneidet. Sie können berechnen, ob ein neuer Kreis jeden vorhandenen Kreis wie folgt schneidet:

    %Vor%

Feinabstimmung: In der Nähe einiger Endpunkte im Pfad des Briefs werden Sie feststellen, dass ein nächster Kreis mit vollem Radius aus der Buchstabenform ausläuft. In diesem Fall könnten Sie den Radius einiger Kreise verkleinern, um sie an die Buchstabenform anzupassen. Wenn Sie nur einen festen Radius für Ihre Kreise wünschen, können Sie den festen Radius aller Kreise basierend auf den durchschnittlichen Radien aller Kreise neu berechnen - einschließlich derjenigen, die Sie "schrumpfen" mussten, um in die Buchstabenform zu passen.

Zum Beispiel. Dies ist der Buchstabe "L" aus 15 Kreisen.

Aber die 2 roten Kreise fallen aus der Buchstabenform heraus. Sie könnten (1) die roten Kreise so verkleinern, dass sie in die Buchstabenform passen, oder (2) einen neuen festen Kreisradius basierend auf den durchschnittlichen Radien, die zur Buchstabenform passen, neu berechnen:

%Vor%

Sie können die Länge des roten Radius berechnen, der zur Buchstabenform passt, indem Sie den Schnittpunkt von 2 Linien berechnen: (1) das Liniensegment, das durch Verbinden der Mitte der letzten grünen Kreise mit der Mitte der roten Kreise (2) gebildet wird senkrecht vom letzten Punkt der Kurve gebildet. Hier ist ein Algorithmus, um den Schnittpunkt von 2 Zeilen zu berechnen:

%Vor%     
markE 17.04.2015 19:08
quelle

Tags und Links