2016-06-29 14 views
0

ich die Möglichkeit gesehen habe, einfach durch eine Verdoppelung des Hubs (und die Änderung der Reihenfolge) beim Schreiben von Text auf Leinwand (see here)einen äußeren Schlag auf Leinwand Text erstellen, ohne einen inneren Schlaganfall

jedoch einen äußeren Schlag zu simulieren , die App, an der ich arbeite, erlaubt die Verwendung von RGBA-Farben. Dadurch ist es möglich, dass der "versteckte" innere Strich sichtbar wird. Hier ein Beispiel:

In diesem Beispiel ist der Strich weiß und die Textfüllung ist rgba (0,0,0,0,5).

Als Ergebnis kann der versteckte weiße innere Strich gesehen werden. Ist es möglich, einen äußeren Schlag ohne das innere anzuwenden? Wenn nicht, ist es möglich, etwas wie eine Schnittmaske auf den Strich anzuwenden, um zu verhindern, dass das Innere sichtbar wird, wenn die Textfüllung Deckkraft hat?

Ich fühle mich wie ich die Antwort hier wissen, aber hoffe, jemand könnte eine clevere Lösung haben.

Dank -

+0

Ja, es ist möglich. Sehen Sie diese Antwort http://StackOverflow.com/A/34234589/3877726 Es wird erläutert, wie dies mit einem Offscreen-Canvas und mit Maskierung, könnte auch mit Clipping-Regionen getan werden. – Blindman67

+0

@ Blindman67, mein Schlechter sah Sie nicht präsentieren gCo masking .. aber immer noch Clipping wird nicht tun :) – Kaiido

+0

@Kaiido Ich sehe nicht, warum es nicht funktionieren würde, gibt es keine Begrenzung für die Clipping-Komplexität und es gibt viele Möglichkeiten, um Pfaddaten für Schriftarten, zum Beispiel SVG-Schriften, zu erhalten. – Blindman67

Antwort

1

Durch eine einfache Abfolge von Zusammensetzung Betrieb verwenden Sie das Ergebnis durch diese Schritte erhalten:

  • Stroke den Text mit Zielfarbe destination-out
  • für Schlaganfall
  • ändern Zusammensetzung Modus
  • Füllen Sie mit einer beliebigen Farbe. Dies wird das Innere zerstören.
  • ändern Zusammensetzung Modus source-over
  • Fill erneut Ziel mit Farbe und alpha

Wenn Sie den Hintergrund sehen, müssen durch Sie diese Schritte auf einem versteckten (Off-Screen) Leinwand zu tun, dann zurück ziehen das Ergebnis über dem Hintergrund.

result

var ctx = c.getContext("2d"); 
 
ctx.font = "128px sans-serif"; 
 
ctx.textBaseline = "top"; 
 
ctx.lineJoin = "round"; 
 
ctx.strokeStyle = "#fff"; 
 
ctx.lineWidth = 11; 
 

 
ctx.strokeText("MY TEXT", 10, 10);     // stroke 
 
ctx.globalCompositeOperation = "destination-out"; // will delete what's under 
 
ctx.fillText("MY TEXT", 10, 10);     // on next draw 
 
ctx.globalCompositeOperation = "source-over";  // normal comp. mode 
 
ctx.fillStyle = "rgba(0,0,0,0.5)";     // draw in target fill/color 
 
ctx.fillText("MY TEXT", 10, 10);
#c {background:rgb(55, 68, 236)}
<canvas id=c width=580></canvas>

+0

Danke das macht sehr viel Sinn. Ich benutze FabricJS, also habe ich ein bisschen Mühe, dies in ihre internen Rendering-Methoden zu integrieren. Ich werde es ein bisschen mehr geben und sehen, ob ich mindestens eine JS-Geige der Grundlagen schaffen kann. – onassar