2017-05-19 5 views
0

Ich möchte ein gestrichenes Rechteck in bestimmten Leinwandbereich löschen. Mein erster Gedanke war, dass ich nur context.strokeRect Funktion wieder mit denselben Parametern aufrufen muss, mit strokeStyle vorher zu transparent zu ändern. Es funktioniert jedoch nicht. Warum und wie kann ich es reparieren? Beachten Sie, dass ich nur den Strich (Rahmen) des Rechtecks ​​löschen möchte, nicht alles im Inneren.HTML Canvas transparente Strichlinie

Edit: Ich möchte nur Rand löschen, nicht alles im Inneren, so kann ich nicht clearRect() Methode verwenden. Außerdem kann ich die gesamte Leinwand nicht löschen und neu streichen, da die Leinwand Animationen enthält.

JS Geige: https://jsfiddle.net/47okok8s/

+0

Anmerkung: RGBA -> (rot, blau, grün, alpha), der Alpha-Wert (im Bereich von [0,1]) die Opazität, 1, vollständig deckend ist [W3 CSS3 Colors] (https://www.w3schools.com/css/css3_colors.asp) –

+0

benutze clearRect, um das bestehende Rechteck zu löschen – karthick

+0

Ich nehme nicht an, dass [dies] (https://jsfiddle.net/2gLj52u4/) würde Arbeit. : P In aller Ernsthaftigkeit glaube ich nicht, dass das möglich ist. Sie hätten wahrscheinlich mehr Glück, wenn Sie den "Malprozess" aufzeichnen und ihn wiedergeben, aber den roten Umrissschritt ausschließen. Leinwand ist viel wie Malen. Sie können diesen Strich nicht einfach rückgängig machen. –

Antwort

0

Beispiel unten hat zwei Leinwand. Die background hat nur etwas Text. Dann fülle ich die foreground Leinwand mit "rot" und verwende globalCompositeOperation"destination-out", um Pixel zu entfernen. Ich setze Alpha auch auf 0,5 und halb entferne einige Pixel.

const ctxB = background.getContext("2d"); 
 
const ctxF = foreground.getContext("2d"); 
 
ctxB.textAlign = "center"; 
 
ctxB.textBaseline = "middle"; 
 
ctxB.font ="20px arial"; 
 
ctxB.fillText("Some Background text",150,25); 
 
ctxB.fillText("Some Background text",150,75); 
 
ctxB.fillText("Some Background text",150,125); 
 

 
ctxF.lineJoin = "round"; 
 
ctxF.fillStyle = "red"; 
 
ctxF.fillRect(0,0,300,150); 
 
ctxF.lineWidth = 8; 
 
ctxF.globalCompositeOperation = "destination-out"; 
 
ctxF.strokeRect(25,25,250,100); 
 
ctxF.fillRect(75,50,150,50); 
 
ctxF.globalAlpha = 0.5; 
 
ctxF.fillRect(65,40,170,70); 
 
ctxF.globalCompositeOperation = "source-over";
canvas { 
 
    position : absolute; 
 
    top : 0px; 
 
    left: 0px; 
 
}
<canvas id = "background"></canvas> 
 
<canvas id = "foreground"></canvas>