Wie kann ich INSIDE eine Form in HTML5-Canvas schneiden?

8

Ich habe eine Anzahl von Beispielen gefunden, um die außerhalb Region eines Bogens zu beschneiden (zB: Dieses Beispiel ). Ich kann nicht herausfinden, wie man stattdessen in die Bogenform schneidet.

Hier ist ein Beispiel, wie ich gerade die äußere Region beschneide, was im Wesentlichen das Gegenteil von dem ist, was ich will:

%Vor%     
Matt Huggins 24.09.2013, 17:22
quelle

3 Antworten

12

Verfügbare Optionen

Für unregelmäßige Formen können Sie zwei Techniken verwenden:

  1. Zusammengesetzter Modus
  2. Beschneiden

Meiner Meinung nach ist es besser, den aktuellen Schnittmodus oder den zusammengesetzten Modus destination-out zu verwenden.

Wie MarkE sagt, ist xor ebenfalls verfügbar, aber xoder invertiert nur Alpha-Pixel und entfernt nicht die RGB-Pixel. Dies funktioniert für solide Bilder ohne Transparenz, aber wo Sie bereits vorhandene Pixel mit Transparenz haben, können diese den gegenteiligen Effekt haben (sichtbar werden) oder wenn Sie später den xor-Modus verwenden, wird der "ausgeschnittene" Bereich erneut angezeigt.

Clipping

Durch Verwendung von Clipping können Sie einfach clearRect verwenden, um den durch den Pfad definierten Bereich zu löschen.

Beispiel:

%Vor%

ONLINE-DEMO FÜR CLIPPING

Quellbild : ein Bild mit teilweise halbtransparenten Pixeln und voll transparent, wo das Weiß vom Hintergrund durchkommt -

Ergebnis:

Wir haben ein Loch hineingestanzt und der Hintergrund zeigt sich:

Composite-Modus: Ziel-Ausgang

Im Composite-Modus löscht destination-out die Pixel wie beim Clipping:

%Vor%

ONLINE-DEMO FÜR DEN COMPOSITE-MODUS :

Ergebnis:

Das gleiche gilt für Clipping, wenn destination-out die Pixel entfernt.

Zusammengesetzter Modus: xor

Verwenden Sie xor in diesem Fall, in dem transparente Pixel vorhanden sind ( siehe Online-Beispiel hier ):

Nur die Alpha-Werte wurden invertiert. Da wir keine festen Pixel haben, wird das Alpha nicht von 255 auf 0 ( 255 - 255 ) sondern 255 - actual value wechseln, was in diesem Modus zu nicht gelöschtem Hintergrund führt.

(Wenn Sie ein zweites Mal mit demselben Modus zeichnen, werden die "entfernten" Pixel wiederhergestellt, so dass dies auf andere Weise genutzt werden kann).

    
K3N 24.09.2013 19:44
quelle
8

Sie können sicherlich mit der 'invertierten' Clipform Ihres Stils schneiden: zeichnen Sie zuerst die Umriss, zeichnen Sie dann Ihren Beschneidungspfad - ohne beginPath -, dann schließen Sie den Pfad und clip.
Auf diese Weise ist die von Ihnen beschriebene Form ein "Loch" innerhalb des Bildschirms Die Pfadfunktion muss einen geschlossenen Pfad beschreiben.

Eine Demo ist hier: Ссылка Wir können sehen, dass es sogar mit mehreren Formen funktioniert, vorausgesetzt, sie schneiden sich nicht.

Der Code sieht folgendermaßen aus:

%Vor%

Anwendungsbeispiel: (zeichnet ein Bild mit einem umgekehrten Clip eines Kreises):

%Vor%

Letzte Bemerkung: Sie können tatsächlich eine beliebige Basisform auswählen, von der subtrahiert werden soll.

    
GameAlchemist 24.09.2013 23:42
quelle
2

Sie können context.globalCompositeOperation="xor" verwenden, um aus Ihrem vorhandenen Bild basierend auf einem Pfad oder einer Zeichnung zu entfernen.

Dieser Compositing-Modus "zieht die vorhandenen Pixel mithilfe einer beliebigen Zeichnung, die Sie nach dem Zusammenfügen verwendet haben," aus.

In diesem Fall wird das vorhandene Bild basierend auf Ihrem Bogen "nicht gezeichnet":

Hier ist Code und eine Geige: Ссылка

%Vor%     
markE 24.09.2013 18:53
quelle

Tags und Links