Ricerca…


Sintassi

  • context.beginPath ()
  • context.moveTo (startx, starty)
  • context.lineTo (EndX, Endy)
  • context.arc (centerX, centerY, radius, startingRadianAngle, endingRadianAngle)
  • context.quadraticCurveTo (controlX, controlY, EndX, Endy)
  • context.bezierCurveTo (controlX1, controlY1, controlX2, controlY2, EndX, Endy)
  • context.arcTo (puntoX1, puntoY1, puntoX2, puntoY2, raggio)
  • context.rect (leftX, topY, width, height);
  • context.closePath ()

Panoramica dei comandi di disegno del percorso di base: linee e curve

==================

TODO: collega ciascuno dei comandi di disegno sotto ai loro singoli esempi. Non so come farlo poiché i collegamenti ai singoli esempi puntano verso la cartella "bozza".

TODO: aggiungi esempi per questi comandi "azione" del percorso: stroke (), fill (), clip ()

==================

Sentiero

Un percorso definisce un insieme di linee e curve che possono essere disegnate visibilmente sulla tela.

Un tracciato non viene disegnato automaticamente sulla tela. Ma le linee e le curve del percorso possono essere disegnate sulla tela usando un tratto stilizzato. E la forma creata dalle linee e dalle curve può anche essere riempita con un riempimento stilizzato.

I percorsi hanno usi che vanno oltre il disegno sulla tela:

  • Hit test se una coordinata x, y è all'interno della forma del percorso.
  • Definire una regione di ritaglio in cui saranno visibili solo i disegni all'interno dell'area di ritaglio. Tutti i disegni all'esterno dell'area di ritaglio non verranno disegnati (== trasparente), in modo simile all'overflow CSS.

I comandi di base del disegno del percorso sono:

  • BeginPath
  • moveTo
  • lineTo
  • arco
  • quadraticCurveTo
  • bezierCurveTo
  • arcTo
  • rect
  • closePath

Descrizione dei comandi di disegno di base:

BeginPath

context.beginPath()

Inizia l'assemblaggio di un nuovo set di comandi di percorso e scarta anche qualsiasi traccia precedentemente assemblato.

Lo scarto è un punto importante e spesso trascurato. Se non inizi un nuovo percorso, tutti i comandi di percorso precedentemente rilasciati verranno automaticamente ridisegnati.

Sposta anche la "penna" del disegno sull'origine in alto a sinistra della tela (== coordinate [0,0]).

moveTo

context.moveTo(startX, startY)

Sposta la posizione corrente della penna sulla coordinata [startX, inizioY].

Di default tutti i disegni di percorso sono collegati insieme. Quindi il punto finale di una linea o curva è il punto di partenza della linea o curva successiva. Ciò può causare l'estrazione di una linea inaspettata che collega due disegni adiacenti. Il comando context.moveTo fondamentalmente "preleva il pennino" e lo posiziona su una nuova coordinata in modo che la linea di collegamento automatica non venga disegnata.

lineTo

context.lineTo(endX, endY)

Disegna un segmento di linea dalla posizione corrente della penna per coordinare [endX, endY]

È possibile assemblare più comandi .lineTo per disegnare una polilinea. Ad esempio, è possibile assemblare 3 segmenti di linea per formare un triangolo.

arco

context.arc(centerX, centerY, radius, startingRadianAngle, endingRadianAngle)

Disegna un arco circolare dato un punto centrale, raggio e angoli di inizio e fine. Gli angoli sono espressi come radianti. Per convertire i gradi in radianti puoi usare questa formula: radians = degrees * Math.PI / 180; .

L'angolo 0 è rivolto direttamente verso destra dal centro dell'arco. Per disegnare un cerchio completo puoi rendere endingAngle = startingAngle + 360 gradi (360 gradi == Math.PI 2): `context.arc (10,10,20,0, Math.PI 2);

Per impostazione predefinita, l'arco viene disegnato in senso orario, Un parametro opzionale [true | false] indica l'arco da disegnare in senso antiorario: context.arc(10,10,20,0,Math.PI*2,true)

quadraticCurveTo

context.quadraticCurveTo(controlX, controlY, endingX, endingY)

Disegna una curva quadratica che inizia dalla posizione corrente della penna fino a una determinata coordinata finale. Un'altra determinata coordinata di controllo determina la forma (curvatura) della curva.

bezierCurveTo

context.bezierCurveTo(control1X, control1Y, control2X, control2Y, endingX, endingY)

Disegna una curva Bezier cubica che inizia dalla posizione corrente della penna fino a una determinata coordinata finale. Altre 2 coordinate di controllo date determinano la forma (curvatura) della curva.

arcTo

context.arcTo(pointX1, pointY1, pointX2, pointY2, radius);

Disegna un arco circolare con un raggio dato. L'arco viene disegnato in senso orario all'interno del cuneo formato dalla posizione attuale della penna e dato due punti: Punto1 e Punto2.

Una linea che collega la posizione corrente della penna e l'inizio dell'arco viene automaticamente disegnata prima dell'arco.

rect

context.rect(leftX, topY, width, height)

Disegna un rettangolo dato un angolo in alto a sinistra e una larghezza e altezza.

context.rect è un comando di disegno univoco perché aggiunge rettangoli disconnessi. Questi rettangoli scollegati non sono automaticamente collegati da linee.

closePath

context.closePath()

Disegna una linea dalla posizione corrente della penna fino alla coordinata del percorso iniziale.

Ad esempio, se disegni 2 linee che formano 2 rami di un triangolo, closePath "chiude" il triangolo disegnando la terza gamba del triangolo dal punto finale della 2a tappa al punto iniziale della prima gamba.

Il nome di questo comando spesso lo rende incompreso. context.closePath NON è un delimitatore finale di context.beginPath . Di nuovo, il comando closePath disegna una linea - non "chiude" un beginPath .

lineTo (un comando di percorso)

context.lineTo(endX, endY)

Disegna un segmento di linea dalla posizione corrente della penna per coordinare [endX, endY]

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var startX=25;
    var startY=20;
    var endX=125;
    var endY=20;

    // Draw a single line segment drawn using "moveTo" and "lineTo" commands
    ctx.beginPath();
    ctx.moveTo(startX,startY);
    ctx.lineTo(endX,endY);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

È possibile assemblare più comandi .line To per disegnare una polilinea. Ad esempio, è possibile assemblare 3 segmenti di linea per formare un triangolo.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var topVertexX=50;
    var topVertexY=20;
    var rightVertexX=75;
    var rightVertexY=70;
    var leftVertexX=25;
    var leftVertexY=70;

    // A set of line segments drawn to form a triangle using
    //     "moveTo" and multiple "lineTo" commands
    ctx.beginPath();
    ctx.moveTo(topVertexX,topVertexY);
    ctx.lineTo(rightVertexX,rightVertexY);
    ctx.lineTo(leftVertexX,leftVertexY);
    ctx.lineTo(topVertexX,topVertexY);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

arco (un comando di percorso)

context.arc(centerX, centerY, radius, startingRadianAngle, endingRadianAngle)

Disegna un arco circolare dato un punto centrale, raggio e angoli di inizio e fine. Gli angoli sono espressi come radianti. Per convertire i gradi in radianti puoi usare questa formula: radians = degrees * Math.PI / 180; .

L'angolo 0 è rivolto direttamente verso destra dal centro dell'arco.

Per impostazione predefinita, l'arco viene disegnato in senso orario, Un parametro opzionale [true | false] indica l'arco da disegnare in senso antiorario: context.arc(10,10,20,0,Math.PI*2,true)

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and its context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var centerX=50;
    var centerY=50;
    var radius=30;
    var startingRadianAngle=Math.PI*2*;  // start at 90 degrees == centerY+radius
    var endingRadianAngle=Math.PI*2*.75;  // end at 270 degrees (==PI*2*.75 in radians)

    // A partial circle (i.e. arc) drawn using the "arc" command
    ctx.beginPath();
    ctx.arc(centerX, centerY, radius,  startingRadianAngle, endingRadianAngle);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

Per disegnare un cerchio completo puoi rendere endingAngle = startingAngle + 360 gradi (360 gradi == Math.PI2).

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and its context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var centerX=50;
    var centerY=50;
    var radius=30;
    var startingRadianAngle=0;       // start at 0 degrees
    var endingRadianAngle=Math.PI*2; // end at 360 degrees (==PI*2 in radians)

    // A complete circle drawn using the "arc" command
    ctx.beginPath();
    ctx.arc(centerX, centerY, radius,  startingRadianAngle, endingRadianAngle);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

quadraticCurveTo (un comando path)

context.quadraticCurveTo(controlX, controlY, endingX, endingY)

Disegna una curva quadratica che inizia dalla posizione corrente della penna fino a una determinata coordinata finale. Un'altra determinata coordinata di controllo determina la forma (curvatura) della curva.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var startX=25;
    var startY=70;
    var controlX=75;
    var controlY=25;
    var endX=125;
    var endY=70;

    // A quadratic curve drawn using "moveTo" and "quadraticCurveTo" commands
    ctx.beginPath();
    ctx.moveTo(startX,startY);
    ctx.quadraticCurveTo(controlX,controlY,endX,endY);
    ctx.stroke();


}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

bezierCurveTo (un comando path)

context.bezierCurveTo(control1X, control1Y, control2X, control2Y, endingX, endingY)

Disegna una curva Bezier cubica che inizia dalla posizione corrente della penna fino a una determinata coordinata finale. Altre 2 coordinate di controllo date determinano la forma (curvatura) della curva.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var startX=25;
    var startY=50;
    var controlX1=75;
    var controlY1=10;
    var controlX2=75;
    var controlY2=90;
    var endX=125;
    var endY=50;      
    
    // A cubic bezier curve drawn using "moveTo" and "bezierCurveTo" commands
    ctx.beginPath();
    ctx.moveTo(startX,startY);
    ctx.bezierCurveTo(controlX1,controlY1,controlX2,controlY2,endX,endY);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

arcTo (un comando path)

context.arcTo(pointX1, pointY1, pointX2, pointY2, radius);

Disegna un arco circolare con un raggio dato. L'arco viene disegnato in senso orario all'interno del cuneo formato dalla posizione attuale della penna e dato due punti: Punto1 e Punto2.

Una linea che collega la posizione corrente della penna e l'inizio dell'arco viene automaticamente disegnata prima dell'arco.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var pointX0=25;
    var pointY0=80;
    var pointX1=75;
    var pointY1=0;
    var pointX2=125;
    var pointY2=80;
    var radius=25;

    // A circular arc drawn using the "arcTo" command. The line is automatically drawn.
    ctx.beginPath();
    ctx.moveTo(pointX0,pointY0);
    ctx.arcTo(pointX1, pointY1, pointX2, pointY2, radius);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

rect (un comando di percorso)

context.rect(leftX, topY, width, height)

Disegna un rettangolo dato un angolo in alto a sinistra e una larghezza e altezza.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var leftX=25;
    var topY=25;
    var width=40;
    var height=25;

    // A rectangle drawn using the "rect" command.
    ctx.beginPath();
    ctx.rect(leftX, topY, width, height);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

context.rect è un comando di disegno univoco perché aggiunge rettangoli disconnessi.

Questi rettangoli scollegati non sono automaticamente collegati da linee.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var leftX=25;
    var topY=25;
    var width=40;
    var height=25;

    // Multiple rectangles drawn using the "rect" command.
    ctx.beginPath();
    ctx.rect(leftX, topY, width, height);
    ctx.rect(leftX+50, topY+20, width, height);
    ctx.rect(leftX+100, topY+40, width, height);
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

closePath (un comando path)

context.closePath()

Disegna una linea dalla posizione corrente della penna fino alla coordinata del percorso iniziale.

Ad esempio, se disegni 2 linee che formano 2 rami di un triangolo, closePath "chiude" il triangolo disegnando la terza gamba del triangolo dal punto finale della 2a tappa al punto iniziale della prima gamba.

Un equivoco spiegato!

Il nome di questo comando spesso lo rende incompreso.

context.closePath NON è un delimitatore finale di context.beginPath .

Di nuovo, il comando closePath disegna una linea - non "chiude" un beginPath.

Questo esempio disegna 2 gambe di un triangolo e usa closePath per completare (chiudere ?!) il triangolo disegnando la terza gamba. Quello che closePath sta effettivamente facendo è tracciare una linea dall'endpoint della seconda gamba fino al punto di partenza della prima gamba.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // arguments
    var topVertexX=50;
    var topVertexY=50;
    var rightVertexX=75;
    var rightVertexY=75;
    var leftVertexX=25;
    var leftVertexY=75;

    // A set of line segments drawn to form a triangle using
    //     "moveTo" and multiple "lineTo" commands
    ctx.beginPath();
    ctx.moveTo(topVertexX,topVertexY);
    ctx.lineTo(rightVertexX,rightVertexY);
    ctx.lineTo(leftVertexX,leftVertexY);

    // closePath draws the 3rd leg of the triangle
    ctx.closePath()

    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

beginPath (un comando path)

context.beginPath()

Inizia l'assemblaggio di un nuovo set di comandi di percorso e scarta anche qualsiasi traccia precedentemente assemblato.

Sposta anche la "penna" del disegno sull'origine in alto a sinistra della tela (== coordinate [0,0]).

Sebbene facoltativo, dovresti SEMPRE avviare un percorso con beginPath

Lo scarto è un punto importante e spesso trascurato. Se non inizi un nuovo percorso con beginPath , qualsiasi comando di percorso precedentemente rilasciato verrà automaticamente ridisegnato.

Questi 2 demo tentano entrambi di disegnare una "X" con un tratto rosso e un tratto blu.

Questa prima demo utilizza correttamente beginPath per avviare il secondo tratto rosso. Il risultato è che la "X" ha correttamente sia una traccia rossa che una blu.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // draw a blue line
    ctx.beginPath();
    ctx.moveTo(30,30);
    ctx.lineTo(100,100);
    ctx.strokeStyle='blue';
    ctx.lineWidth=3;
    ctx.stroke();

    // draw a red line
    ctx.beginPath();        // Important to begin a new path! 
    ctx.moveTo(100,30);
    ctx.lineTo(30,100);
    ctx.strokeStyle='red';
    ctx.lineWidth=3;
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

Questa seconda demo lascia erroneamente beginPath al secondo colpo. Il risultato è che la "X" ha erroneamente entrambi i tratti rossi.

Il secondo stroke() disegna il secondo tratto rosso.

Ma senza un secondo beginPath , quello stesso secondo stroke() inoltre ridisegna in modo errato il primo tratto.

Poiché il secondo stroke() è ora stilizzato in rosso, il primo tratto blu viene sovrascritto da un tratto rosso colorato in modo errato.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // get a reference to the canvas element and it's context
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // draw a blue line
    ctx.beginPath();
    ctx.moveTo(30,30);
    ctx.lineTo(100,100);
    ctx.strokeStyle='blue';
    ctx.lineWidth=3;
    ctx.stroke();

    // draw a red line
    // Note: The necessary 'beginPath' is missing! 
    ctx.moveTo(100,30);
    ctx.lineTo(30,100);
    ctx.strokeStyle='red';
    ctx.lineWidth=3;
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=200 height=150></canvas>
</body>
</html>

lineCap (un attributo styling del percorso)

context.lineCap=capStyle  // butt (default), round, square

Imposta lo stile del cappuccio dei punti iniziali e finali della linea.

  • butt , lo stile lineCap predefinito, mostra i cappucci quadrati che non si estendono oltre i punti iniziale e finale della linea.

  • round , mostra tappi arrotondati che si estendono oltre i punti di inizio e fine della linea.

  • quadrato , mostra i cappucci quadrati che si estendono oltre i punti di inizio e fine della linea.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    ctx.lineWidth=15;

    // lineCap default: butt
    ctx.lineCap='butt';  
    drawLine(50,40,200,40);

    // lineCap: round
    ctx.lineCap='round';  
    drawLine(50,70,200,70);

    // lineCap: square
    ctx.lineCap='square';  
    drawLine(50,100,200,100);

    // utility function to draw a line
    function drawLine(startX,startY,endX,endY){
        ctx.beginPath();
        ctx.moveTo(startX,startY);
        ctx.lineTo(endX,endY);
        ctx.stroke();
    }

    // For demo only,
    // Rulers to show which lineCaps extend beyond endpoints
    ctx.lineWidth=1;
    ctx.strokeStyle='red';
    drawLine(50,20,50,120);
    drawLine(200,20,200,120);

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=300 height=200></canvas>
</body>
</html>

lineJoin (un attributo styling del percorso)

context.lineJoin=joinStyle  // miter (default), round, bevel

Imposta lo stile utilizzato per collegare segmenti di linea contigui.

  • mitra , l'impostazione predefinita, unisce i segmenti di linea con un giunto appuntito.
  • rotondo , unisce segmenti di linea con un giunto arrotondato.
  • smusso , unisce segmenti di linea con un giunto smussato .

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    ctx.lineWidth=15;

    // lineJoin: miter (default)
    ctx.lineJoin='miter';
    drawPolyline(50,30);

    // lineJoin: round
    ctx.lineJoin='round';
    drawPolyline(50,80);

    // lineJoin: bevel
    ctx.lineJoin='bevel';
    drawPolyline(50,130);

    // utility to draw polyline 
    function drawPolyline(x,y){
        ctx.beginPath();
        ctx.moveTo(x,y);
        ctx.lineTo(x+30,y+30);
        ctx.lineTo(x+60,y);
        ctx.lineTo(x+90,y+30);
        ctx.stroke();
    }

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=300 height=200></canvas>
</body>
</html>

strokeStyle (un attributo styling del percorso)

context.strokeStyle=color

Imposta il colore che verrà utilizzato per tracciare il contorno del percorso corrente.

Queste sono opzioni di color (queste devono essere citate):

  • Un colore denominato CSS , ad esempio context.strokeStyle='red'

  • Un colore esadecimale , ad esempio context.strokeStyle='#FF0000'

  • Un colore RGB , ad esempio context.strokeStyle='rgb(red,green,blue)' dove rosso, verde e blu sono numeri interi 0-255 che indicano la forza di ciascun colore del componente.

  • Un colore HSL , ad esempio context.strokeStyle='hsl(hue,saturation,lightness)' dove hue è un numero intero 0-360 sulla ruota dei colori e saturazione e luminosità sono percentuali (0-100%) che indicano la forza di ciascun componente .

  • Un colore HSLA , ad esempio context.strokeStyle='hsl(hue,saturation,lightness,alpha)' dove hue è un numero intero 0-360 sulla ruota dei colori e saturazione e luminosità sono percentuali (0-100%) che indicano la forza di ogni componente e alfa è un valore decimale 0.00-1.00 che indica l'opacità.

Puoi anche specificare queste opzioni colore (queste opzioni sono oggetti creati dal contesto):

  • Un gradiente lineare che è un oggetto gradiente lineare creato con context.createLinearGradient

  • Un gradiente radiale che è un oggetto gradiente radiale creato con context.createRadialGradient

  • Un motivo che è un oggetto modello creato con context.createPattern

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    ctx.lineWidth=15;

    // stroke using a CSS color: named, RGB, HSL, etc
    ctx.strokeStyle='red';
    drawLine(50,40,250,40);

    // stroke using a linear gradient
    var gradient = ctx.createLinearGradient(75,75,175,75);
    gradient.addColorStop(0,'red');
    gradient.addColorStop(1,'green');
    ctx.strokeStyle=gradient;
    drawLine(50,75,250,75);

    // stroke using a radial gradient
    var gradient = ctx.createRadialGradient(100,110,15,100,110,45);
    gradient.addColorStop(0,'red');
    gradient.addColorStop(1,'green');
    ctx.strokeStyle=gradient;
    ctx.lineWidth=20;
    drawLine(50,110,250,110);

    // stroke using a pattern
    var patternImage=new Image();
    patternImage.onload=function(){
        var pattern = ctx.createPattern(patternImage,'repeat');
        ctx.strokeStyle=pattern;
        drawLine(50,150,250,150);
    }
    patternImage.src='https://dl.dropboxusercontent.com/u/139992952/stackoverflow/BooMu1.png';

    // for demo only, draw labels by each stroke
    ctx.textBaseline='middle';
    ctx.font='14px arial';
    ctx.fillText('CSS color',265,40);
    ctx.fillText('Linear Gradient color',265,75);
    ctx.fillText('Radial Gradient color',265,110);
    ctx.fillText('Pattern color',265,150);

    // utility to draw a line
    function drawLine(startX,startY,endX,endY){
        ctx.beginPath();
        ctx.moveTo(startX,startY);
        ctx.lineTo(endX,endY);
        ctx.stroke();
    }

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=425 height=200></canvas>
</body>
</html>

fillStyle (un attributo styling del percorso)

context.fillStyle=color

Imposta il colore che verrà utilizzato per riempire l'interno del percorso corrente.

Queste sono opzioni di colore (queste devono essere citate):

  • Un colore denominato CSS , ad esempio context.fillStyle='red'

  • Un colore esadecimale , ad esempio context.fillStyle='#FF0000'

  • Un colore RGB , ad esempio context.fillStyle='rgb(red,green,blue)' dove rosso, verde e blu sono numeri interi 0-255 che indicano la forza di ciascun colore del componente.

  • Un colore HSL , ad esempio context.fillStyle='hsl(hue,saturation,lightness)' dove hue è un numero intero 0-360 sulla ruota dei colori e saturazione e luminosità sono percentuali (0-100%) che indicano la forza di ciascun componente .

  • Un colore HSLA , ad esempio context.fillStyle='hsl(hue,saturation,lightness,alpha)' dove hue è un numero intero 0-360 sulla ruota dei colori e saturazione e luminosità sono percentuali (0-100%) che indicano la forza di ogni componente e alfa è un valore decimale 0.00-1.00 che indica l'opacità.

Puoi anche specificare queste opzioni colore (queste opzioni sono oggetti creati dal contesto):

  • Un gradiente lineare che è un oggetto gradiente lineare creato con context.createLinearGradient
  • Un gradiente radiale che è un oggetto gradiente radiale creato con context.createRadialGradient
  • Un motivo che è un oggetto modello creato con context.createPattern

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // stroke using a CSS color: named, RGB, HSL, etc
    ctx.fillStyle='red';
    ctx.fillRect(50,50,100,50);

    // stroke using a linear gradient
    var gradient = ctx.createLinearGradient(225,50,300,50);
    gradient.addColorStop(0,'red');
    gradient.addColorStop(1,'green');
    ctx.fillStyle=gradient;
    ctx.fillRect(200,50,100,50);

    // stroke using a radial gradient
    var gradient = ctx.createRadialGradient(100,175,5,100,175,30);
    gradient.addColorStop(0,'red');
    gradient.addColorStop(1,'green');
    ctx.fillStyle=gradient;
    ctx.fillRect(50,150,100,50);

    // stroke using a pattern
    var patternImage=new Image();
    patternImage.onload=function(){
        var pattern = ctx.createPattern(patternImage,'repeat');
        ctx.fillStyle=pattern;
        ctx.fillRect(200,150,100,50);
    }
    patternImage.src='http://i.stack.imgur.com/ixrWe.png';

    // for demo only, draw labels by each stroke
    ctx.fillStyle='black';
    ctx.textAlign='center';
    ctx.textBaseline='middle';
    ctx.font='14px arial';
    ctx.fillText('CSS color',100,40);
    ctx.fillText('Linear Gradient color',250,40);
    ctx.fillText('Radial Gradient color',100,140);
    ctx.fillText('Pattern color',250,140);

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=350 height=250></canvas>
</body>
</html>

lineWidth (attributo di stile del percorso)

context.lineWidth=lineWidth

Imposta la larghezza della linea che traccerà il contorno del percorso

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    ctx.lineWidth=1;
    drawPolyline(50,50);

    ctx.lineWidth=5;
    drawPolyline(50,100);

    ctx.lineWidth=10;
    drawPolyline(50,150);


    // utility to draw a polyline 
    function drawPolyline(x,y){
        ctx.beginPath();
        ctx.moveTo(x,y);
        ctx.lineTo(x+30,y+30);
        ctx.lineTo(x+60,y);
        ctx.lineTo(x+90,y+30);
        ctx.stroke();
    }

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=350 height=250></canvas>
</body>
</html>

shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY (attributi di styling del percorso)

shadowColor = color        // CSS color
shadowBlur =  width        // integer blur width
shadowOffsetX = distance   // shadow is moved horizontally by this offset
shadowOffsetY = distance   // shadow is moved vertically by this offset

Questo insieme di attributi aggiungerà un'ombra attorno a un tracciato.

Sia i percorsi riempiti che i percorsi tracciati possono avere un'ombra.

L'ombra è più scura (opaca) sul perimetro del percorso e diventa gradualmente più leggera mentre si allontana dal perimetro del percorso.

  • shadowColor indica quale colore CSS verrà utilizzato per creare l'ombra.
  • shadowBlur è la distanza su cui l'ombra si estende verso l'esterno dal percorso.
  • shadowOffsetX è una distanza per cui l'ombra viene spostata orizzontalmente dal percorso. Una distanza positiva sposta l'ombra verso destra, una distanza negativa sposta l'ombra verso sinistra.
  • shadowOffsetY è una distanza per cui l'ombra viene spostata verticalmente lontano dal percorso. Una distanza positiva sposta l'ombra verso il basso, una distanza negativa sposta l'ombra verso l'alto.

Informazioni su shadowOffsetX e shadowOffsetY

È importante notare che l'intera ombra è spostata nella sua interezza . Ciò farà sì che parte dell'ombra si sposti al di sotto dei percorsi riempiti e quindi parte dell'ombra non sarà visibile.

Informazioni sui tratti ombreggiati

Quando si ombreggia un tratto, l'interno e l'esterno del tratto sono ombreggiati. L'ombra è più scura nel tratto e si illumina quando l'ombra si estende verso l'esterno in entrambe le direzioni rispetto al tratto.

Disattivazione dell'ombreggiamento al termine

Dopo aver disegnato le ombre, potresti voler disattivare lo shadowing per disegnare più percorsi. Per disattivare l'ombreggiatura, imposta shadowColor su trasparente.

context.shadowColor = 'rgba(0,0,0,0)';

Considerazioni sulle prestazioni

Le ombre (come i gradienti) richiedono calcoli estesi e quindi è necessario utilizzare le ombre con parsimonia.

Prestare particolare attenzione durante l'animazione, poiché disegnare ombre molte volte al secondo avrà un impatto notevole sulle prestazioni. Una soluzione alternativa se è necessario animare i percorsi ombreggiati consiste nel pre-creare il percorso ombreggiato su un secondo "riquadro ombra". La tela ombra è una tela normale che viene creata in memoria con document.createElement : non viene aggiunta al DOM (è solo una tela di staging). Quindi disegna la tela ombra sulla tela principale. Questo è molto più veloce perché i calcoli dell'ombra non devono essere fatti molte volte al secondo. Tutto quello che stai facendo è copiare una tela prefabbricata sulla tela visibile.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // shadowed stroke
    ctx.shadowColor='black';
    ctx.shadowBlur=6;
    ctx.strokeStyle='red';
    ctx.strokeRect(50,50,100,50);
    // darken the shadow by stroking a second time
    ctx.strokeRect(50,50,100,50);

    // shadowed fill
    ctx.shadowColor='black';
    ctx.shadowBlur=10;
    ctx.fillStyle='red';
    ctx.fillRect(225,50,100,50);
    // darken the shadow by stroking a second time
    ctx.fillRect(225,50,100,50);

    // the shadow offset rightward and downward 
    ctx.shadowColor='black';
    ctx.shadowBlur=10;
    ctx.shadowOffsetX=5;
    ctx.shadowOffsetY=5;
    ctx.fillStyle='red';
    ctx.fillRect(50,175,100,50);

    // a wider blur (==extends further from the path)
    ctx.shadowColor='black';
    ctx.shadowBlur=35;
    ctx.fillStyle='red';
    ctx.fillRect(225,175,100,50);

    // always clean up! Turn off shadowing
    ctx.shadowColor='rgba(0,0,0,0)';

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=400 height=300></canvas>
</body>
</html>

createLinearGradient (crea un oggetto di stile del percorso)

var gradient = createLinearGradient( startX, startY, endX, endY )
gradient.addColorStop(gradientPercentPosition, CssColor)
gradient.addColorStop(gradientPercentPosition, CssColor)
[optionally add more color stops to add to the variety of the gradient]

Crea un gradiente lineare riutilizzabile (oggetto).

L'oggetto può essere assegnato a qualsiasi strokeStyle e / o fillStyle .

Quindi il tratto () o il riempimento () coloreranno il tracciato con i colori sfumati dell'oggetto.

La creazione di un oggetto sfumato è una procedura in due passaggi:

  1. Crea l'oggetto gradiente stesso. Durante la creazione, definisci una linea sulla tela in cui inizia e termina la sfumatura. L'oggetto gradiente viene creato con var gradient = context.createLinearGradient .
  2. Quindi aggiungi 2 (o più) colori che compongono il gradiente. Questo viene fatto aggiungendo più stop di colore all'oggetto gradient.addColorStop con gradient.addColorStop .

Argomenti:

  • startX, startY è la coordinata del canvas in cui inizia la sfumatura. Al punto di partenza (e prima) la tela è solidamente il colore della più bassa gradientPercentPosition .

  • endX, endY è la coordinata del canvas in cui termina il gradiente. Al punto finale (e dopo) la tela è solidamente il colore della più alta gradientPercentPosition .

  • gradientPercentPosition è un numero float compreso tra 0,00 e 1,00 assegnato a un arresto colore. È fondamentalmente un waypoint in percentuale lungo la linea in cui si applica questo particolare arresto del colore.

    • Il gradiente inizia alla percentuale 0,00 che è [startX, startY] sulla tela.
    • Il gradiente termina con la percentuale 1,00 che è [endX, endY] sulla tela.
    • Nota tecnica: il termine "percentuale" non è tecnicamente corretto poiché i valori vanno da 0,00 a 1,00 anziché dallo 0% al 100%.
  • CssColor è un colore CSS assegnato a questo particolare arresto del colore.

L'oggetto gradiente è un oggetto che puoi usare (e riutilizzare!) Per fare in modo che i tratti e i riempimenti del tuo percorso diventino sfumati.

Nota a margine: l'oggetto sfumato non è interno all'elemento Canvas né è Context. È un oggetto JavaScript separato e riutilizzabile che puoi assegnare a qualsiasi percorso che desideri. Puoi persino usare questo oggetto per colorare un percorso su un elemento Canvas diverso (!)

Le interruzioni di colore sono (percentuali) waypoint lungo la linea del gradiente. Ad ogni fermo del colore, il gradiente è completamente (== opaco) colorato con il colore assegnato. I punti intermedi lungo la linea del gradiente tra i fermi colore sono colorati come gradienti di questo e del colore precedente.

Suggerimento importante sui gradienti della tela!

Quando crei un oggetto sfumato, l'intera tela è "invisibilmente" piena di quel gradiente.

Quando si percorre stroke() o si fill() un tracciato, il gradiente invisibile viene rivelato, ma solo rivelato su quel percorso che viene tracciato o riempito.

  1. Se crei un gradiente lineare da rosso a magenta come questo:

     // create a linearGradient
     var gradient=ctx.createLinearGradient(100,0,canvas.width-100,0);
     gradient.addColorStop(0,'red');
     gradient.addColorStop(1,'magenta');
     ctx.fillStyle=gradient;
    
  2. Quindi Canvas visualizzerà "in modo invisibile" la creazione della sfumatura in questo modo:

inserisci la descrizione dell'immagine qui

  1. Ma fino a quando non si stroke() o si fill() con il gradiente, non vedrai nessuno dei gradienti sulla tela.

  2. Infine, se si accarezza o si riempie un percorso usando la sfumatura, la sfumatura "invisibile" diventa visibile sulla tela ... ma solo dove viene disegnato il tracciato.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // Create a linearGradient
    // Note: Nothing visually appears during this process
    var gradient=ctx.createLinearGradient(100,0,canvas.width-100,0);
    gradient.addColorStop(0,'red');
    gradient.addColorStop(1,'magenta');

    // Create a polyline path 
    // Note: Nothing visually appears during this process
    var x=20;
    var y=40;
    ctx.lineCap='round';
    ctx.lineJoin='round';
    ctx.lineWidth=15;
    ctx.beginPath();
    ctx.moveTo(x,y);
    ctx.lineTo(x+30,y+50);
    ctx.lineTo(x+60,y);
    ctx.lineTo(x+90,y+50);
    ctx.lineTo(x+120,y);
    ctx.lineTo(x+150,y+50);
    ctx.lineTo(x+180,y);
    ctx.lineTo(x+210,y+50);
    ctx.lineTo(x+240,y);
    ctx.lineTo(x+270,y+50);
    ctx.lineTo(x+300,y);
    ctx.lineTo(x+330,y+50);
    ctx.lineTo(x+360,y);

    // Set the stroke style to be the gradient
    // Note: Nothing visually appears during this process
    ctx.strokeStyle=gradient;
    
    // stroke the path
    // FINALLY! The gradient-stroked path is visible on the canvas
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=400 height=150></canvas>
</body>
</html>

createRadialGradient (crea un oggetto di stile del percorso)

var gradient = createRadialGradient( 
      centerX1, centerY1, radius1,     // this is the "display' circle
      centerX2, centerY2, radius2      // this is the "light casting" circle
)
gradient.addColorStop(gradientPercentPosition, CssColor)
gradient.addColorStop(gradientPercentPosition, CssColor)
[optionally add more color stops to add to the variety of the gradient]

Crea un gradiente radiale riutilizzabile (oggetto). L'oggetto gradiente è un oggetto che puoi usare (e riutilizzare!) Per fare in modo che i tratti e i riempimenti del tuo percorso diventino sfumati.

Di...

Il gradiente radiale Canvas è estremamente diverso dai tradizionali gradienti radiali.

La definizione "ufficiale" (quasi indecifrabile!) Del gradiente radiale di Canvas è in fondo a questo post. Non guardarlo se hai una debole predisposizione !!

In termini (quasi comprensibili):

  • Il gradiente radiale ha 2 cerchi: un cerchio "casting" e un cerchio "display".
  • Il cerchio di lancio proietta la luce nel cerchio del display.
  • Quella luce è il gradiente.
  • La forma di quella luce sfumata è determinata dalla dimensione relativa e dalla posizione di entrambi i cerchi.

La creazione di un oggetto sfumato è una procedura in due passaggi:

  1. Crea l'oggetto gradiente stesso. Durante la creazione, definisci una linea sulla tela in cui inizia e termina la sfumatura. L'oggetto gradiente viene creato con var gradient = context.radialLinearGradient .
  2. Quindi aggiungi 2 (o più) colori che compongono il gradiente. Questo viene fatto aggiungendo più stop di colore all'oggetto gradient.addColorStop con gradient.addColorStop .

Argomenti:

  • centerX1, centerY1, raggio1 definisce un primo cerchio in cui verrà visualizzato il gradiente.

  • centerX2, centerY2, raggio2 definisce un secondo cerchio che lancia la luce sfumata nel primo cerchio.

  • gradientPercentPosition è un numero float compreso tra 0,00 e 1,00 assegnato a un arresto colore. È fondamentalmente un punto di riferimento in percentuale che definisce dove questo particolare arresto del colore si applica lungo il gradiente.

    • Il gradiente inizia in percentuale 0,00.
    • Il gradiente termina in percentuale 1,00.
    • Nota tecnica: il termine "percentuale" non è tecnicamente corretto poiché i valori vanno da 0,00 a 1,00 anziché dallo 0% al 100%.
  • CssColor è un colore CSS assegnato a questo particolare arresto del colore.

Nota a margine: l'oggetto sfumato non è interno all'elemento Canvas né è Context. È un oggetto JavaScript separato e riutilizzabile che puoi assegnare a qualsiasi percorso che desideri. Puoi persino usare questo oggetto per colorare un percorso su un elemento Canvas diverso (!)

Le interruzioni di colore sono (percentuali) waypoint lungo la linea del gradiente. Ad ogni fermo del colore, il gradiente è completamente (== opaco) colorato con il colore assegnato. I punti intermedi lungo la linea del gradiente tra i fermi colore sono colorati come gradienti di questo e del colore precedente.

Suggerimento importante sui gradienti della tela!

Quando crei un oggetto sfumato, l'intera sfumatura radiale viene proiettata "in modo invisibile" sulla tela.

Quando si percorre stroke() o si fill() un tracciato, il gradiente invisibile viene rivelato, ma solo rivelato su quel percorso che viene tracciato o riempito.

  1. Se crei un gradiente radiale da verde a rosso come questo:

     // create a radialGradient
     var x1=150;
     var y1=150;
     var x2=280;
     var y2=150;
     var r1=100;
     var r2=120;
     var gradient=ctx.createRadialGradient(x1,y1,r1,x2,y2,r2);
     gradient.addColorStop(0,'red');
     gradient.addColorStop(1,'green');
     ctx.fillStyle=gradient;
    
  1. Quindi Canvas visualizzerà "in modo invisibile" la creazione della sfumatura in questo modo:

inserisci la descrizione dell'immagine qui

  1. Ma fino a quando non si stroke() o si fill() con il gradiente, non vedrai nessuno dei gradienti sulla tela.

  2. Infine, se si accarezza o si riempie un percorso usando la sfumatura, la sfumatura "invisibile" diventa visibile sulla tela ... ma solo dove viene disegnato il tracciato.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; padding:10px; }
    #canvas{border:1px solid blue; }
</style>
<script>
window.onload=(function(){

    // canvas related vars
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    
    // create a radial gradient
    var x1=150;
    var y1=175;
    var x2=350;
    var y2=175;
    var r1=100;
    var r2=40;
    x2=x1;
    var gradient=ctx.createRadialGradient(x1,y1,r1,x2,y2,r2);
    gradient.addColorStop(0,'red');
    gradient.addColorStop(1,'green');
    ctx.fillStyle=gradient;

    // fill a path with the gradient
    ctx.beginPath();
    ctx.moveTo(150,0);
    ctx.lineTo(300,150);
    ctx.lineTo(150,325);
    ctx.lineTo(0,150);
    ctx.lineTo(150,0);
    ctx.fill();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=300 height=325></canvas>
</body>
</html>

I dettagli ufficiali spaventosi

Chi decide cosa `creaRadialGradient?

Il W3C rilascia le specifiche ufficiali raccomandate che i browser usano per costruire l'elemento Html5 Canvas.

Le specifiche W3C per createRadialGradient leggono in modo criptico come questo:

Cosa crea createRadialGradient

createRadialGradient ... crea effettivamente un cono, toccato dai due cerchi definiti nella creazione del gradiente, con la parte del cono prima del cerchio iniziale (0.0) utilizzando il colore del primo offset, la parte del cono dopo il cerchio finale (1.0) utilizzando il colore dell'ultimo offset e le aree esterne al cono non toccate dal gradiente (nero trasparente).

Come funziona internamente

Il createRadialGradient(x0, y0, r0, x1, y1, r1) accetta sei argomenti, i primi tre rappresentano il cerchio iniziale con origine (x0, y0) e raggio r0 e gli ultimi tre rappresentano il cerchio finale con origine (x1 , y1) e raggio r1. I valori sono in unità spaziali coordinate. Se uno dei file r0 o r1 è negativo, deve essere generata un'eccezione IndexSizeError. In caso contrario, il metodo deve restituire un CanvasGradient radiale inizializzato con i due cerchi specificati.

I gradienti radiali devono essere visualizzati seguendo questi passaggi:

  1. Se x0 = x1 e y0 = y1 e r0 = r1, allora il gradiente radiale non deve dipingere nulla. Annullare questi passaggi.
  2. Sia x (ω) = (x1-x0) ω + x0; Sia y (ω) = (y1-y0) ω + y0; Sia r (ω) = (r1-r0) ω + r0 Lascia che il colore in ω sia il colore in quella posizione sul gradiente (con i colori che provengono dall'interpolazione e dall'estrapolazione sopra descritti).
  3. Per tutti i valori di ω dove r (ω)> 0, partendo dal valore di ω più vicino all'infinito positivo e finendo con il valore di ω più vicino all'infinito negativo, traccia la circonferenza del cerchio con raggio r (ω) in posizione ( x (ω), y (ω)), con il colore in ω, ma solo la pittura sulle parti della tela che non sono state ancora dipinte da cerchi precedenti in questo passaggio per questo rendering del gradiente.

createPattern (crea un oggetto di stile del percorso)

var pattern = createPattern(imageObject,repeat)

Crea un modello riutilizzabile (oggetto).

L'oggetto può essere assegnato a qualsiasi strokeStyle e / o fillStyle .

Quindi stroke () o fill () dipingerà il Path con il pattern dell'oggetto.

Argomenti:

  • imageObject è un'immagine che verrà utilizzata come pattern. La fonte dell'immagine può essere:

    • HTMLImageElement --- un elemento img o una nuova immagine (),
    • HTMLCanvasElement --- un elemento canvas,
    • HTMLVideoElement --- un elemento video (catturerà il fotogramma video corrente)
    • ImageBitmap,
    • Blob.
  • repeat determina come l'imageObject verrà ripetuto sull'area di disegno (proprio come in uno sfondo CSS). Questo argomento deve essere delimitato da virgolette e i valori validi sono:

    • "repeat" --- il pattern riempie orizzontalmente e verticalmente la tela
    • "repeat-x" --- il pattern si ripeterà solo orizzontalmente (1 riga orizzontale)
    • "repeat-y" --- il pattern si ripeterà solo verticalmente (1 riga verticale)
    • "repeat none" --- il pattern appare solo una volta (in alto a sinistra)

L'oggetto modello è un oggetto che puoi usare (e riutilizzare!) Per fare in modo che i tratti e i riempimenti del tuo percorso vengano modellati.

Nota a margine: l'oggetto modello non è interno all'elemento Canvas né è Context. È un oggetto JavaScript separato e riutilizzabile che puoi assegnare a qualsiasi percorso che desideri. Puoi persino usare questo oggetto per applicare il modello a un tracciato su un elemento Canvas diverso (!)

Suggerimento importante sui modelli di tela!

Quando crei un oggetto motivo, l'intera tela è "invisibilmente" piena di quel motivo (soggetto all'argomento repeat ).

Quando si percorre stroke() o si fill() un percorso, viene rivelato il motivo invisibile, ma solo rivelato su quel percorso che viene tracciato o riempito.

  1. Inizia con un'immagine che desideri utilizzare come modello. Importante (!): Assicurati che l'immagine sia completamente caricata (utilizzando patternimage.onload ) prima di provare a utilizzarla per creare il tuo pattern.

inserisci la descrizione dell'immagine qui

  1. Crei uno schema come questo:

     // create a pattern
     var pattern = ctx.createPattern(patternImage,'repeat');
     ctx.fillStyle=pattern;
    
  2. Quindi Canvas visualizzerà "invisibilmente" la creazione del tuo pattern in questo modo:

inserisci la descrizione dell'immagine qui

  1. Ma fino a quando non si stroke() o si fill() con il motivo, non vedrai nessuno dei motivi sulla tela.

  2. Infine, se si fa un tratto o si riempie un percorso usando il modello, il motivo "invisibile" diventa visibile sulla tela ... ma solo dove viene disegnato il tracciato.

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    // fill using a pattern
    var patternImage=new Image();
    // IMPORTANT! 
    // Always use .onload to be sure the image has
    //     fully loaded before using it in .createPattern
    patternImage.onload=function(){
        // create a pattern object
        var pattern = ctx.createPattern(patternImage,'repeat');
        // set the fillstyle to that pattern
        ctx.fillStyle=pattern;
        // fill a rectangle with the pattern
        ctx.fillRect(50,50,150,100);
        // demo only, stroke the rect for clarity
        ctx.strokeRect(50,50,150,100);
    }
    patternImage.src='http://i.stack.imgur.com/K9EZl.png';

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=325 height=250></canvas>
</body>
</html>

tratto (un comando di percorso)

context.stroke()

Fa sì che il perimetro del tracciato venga tracciato in base al context.strokeStyle corrente.strokeStyle e il tracciato tratteggiato viene visivamente disegnato sull'area di disegno.

Prima di eseguire context.stroke (o context.fill ) il Path esiste in memoria e non è ancora disegnato visivamente sulla tela.

I tratti inusuali sono disegnati

Considera questo esempio Path che disegna una linea nera da 1 pixel da [0,5] a [5,5] :

// draw a 1 pixel black line from [0,5] to [5,5]
context.strokeStyle='black';
context.lineWidth=1;
context.beginPath();
context.moveTo(0,5);
context.lineTo(5,5);
context.stroke();

Domanda: che cosa il browser effettivamente disegna sulla tela?

Probabilmente ti aspetteresti di ottenere 6 pixel neri su y = 5

inserisci la descrizione dell'immagine qui

Ma (!) ... La tela disegna sempre tratti a metà strada su entrambi i lati del percorso definito!

Quindi dal momento che la linea è definita in y==5.0 Canvas vuole tracciare la linea tra y==4.5 e y==5.5

inserisci la descrizione dell'immagine qui

Ma, ancora una volta (!) ... Il display del computer non può disegnare mezzo pixel!

Quindi cosa si deve fare con i semi-pixel indesiderati (mostrati in blu sotto)?

inserisci la descrizione dell'immagine qui

La risposta è che Canvas in effetti ordina al display di disegnare una linea larga 2 pixel dalla 4.0 alla 6.0 . Inoltre, colora la linea più chiara del black definito. Questo strano comportamento di disegno è "anti-aliasing" e aiuta Canvas a evitare di disegnare tratti che sembrano frastagliati.

inserisci la descrizione dell'immagine qui

Un trucco di regolazione che funziona SOLO per i tratti orizzontali e verticali

Puoi ottenere una linea nera piena di 1 pixel specificando la linea da disegnare sul mezzo pixel:

context.moveTo(0,5.5);
context.lineto(5,5.5);

inserisci la descrizione dell'immagine qui

Esempio di codice che utilizza context.stroke() per tracciare un tracciato tracciato sulla tela:

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    ctx.beginPath();
    ctx.moveTo(50,30);
    ctx.lineTo(75,55);
    ctx.lineTo(25,55);
    ctx.lineTo(50,30);
    ctx.lineWidth=2;
    ctx.stroke();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=100 height=100></canvas>
</body>
</html>

riempire (un comando di percorso)

context.fill()

Fa sì che l'interno del percorso venga riempito in base al context.fillStyle corrente.fillStyle e il percorso riempito viene visivamente disegnato sulla tela.

Prima di eseguire context.fill (o context.stroke ) il Path esiste in memoria e non è ancora disegnato visivamente sulla tela.

Esempio di codice utilizzando context.fill() per disegnare un percorso pieno context.fill() di disegno:

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    ctx.beginPath();
    ctx.moveTo(50,30);
    ctx.lineTo(75,55);
    ctx.lineTo(25,55);
    ctx.lineTo(50,30);
    ctx.fillStyle='blue';
    ctx.fill();

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=100 height=100></canvas>
</body>
</html>

clip (un comando di percorso)

context.clip

Limita eventuali disegni futuri da visualizzare solo all'interno del percorso corrente.

Esempio: ritaglia questa immagine in un percorso triangolare

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

<!doctype html>
<html>
<head>
<style>
    body{ background-color:white; }
    #canvas{border:1px solid red; }
</style>
<script>
window.onload=(function(){

    // canvas related variables
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var img=new Image();
    img.onload=start;
    img.src='http://i.stack.imgur.com/1CqWf.jpg'

    function start(){
        // draw a triangle path
        ctx.beginPath();
        ctx.moveTo(75,50);
        ctx.lineTo(125,100);
        ctx.lineTo(25,100);
        ctx.lineTo(75,50);
        
        // clip future drawings to appear only in the triangle
        ctx.clip();
        
        // draw an image
        ctx.drawImage(img,0,0);
    }

}); // end window.onload
</script>
</head>
<body>
    <canvas id="canvas" width=150 height=150></canvas>
</body>
</html>


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow