Wir schauen uns in diesem Tutorial die Grundlagen des HTML5-Canvas-Elements an. Es geht darum einfache Formen zu zeichnen und Bilder ganz oder als Ausschnitt in einem Canvas-Element darzustellen
Was ist das HTML5-Canvas überhaupt?
HTML-Canvas ist ein HTML-Element, das einen rechteckigen Bereich auf einer Webseite definiert. Anders als SVG (vektorbasiert) arbeitet Canvas direkt mit einzelnen Pixeln (Bitmap). Gezeichnete Figuren (wie ein Kreis oder Rechteck) sind kein eigenständiges Element im Document Object Model (DOM). Der Browser weiß nach dem Zeichnen nicht mehr, wo sich ein Objekt im Canvas befindet.
Canvas ist deal für Spiele, Animationen, Diagramme oder Echtzeit-Bildbearbeitung.
Wir benötigen also zuerst ein HTML Dokument in dem wir ein Canavas-Element definieren. Etwas CSS sorgt für ein Schachbrettmuster, das uns eine bessere Übersicht bei den weiteren kleinen Experimenten mit dem Canvas-Element geben soll.
Die Höhe und Breite wurde im obigen Quelltext direkt im Tag mit einer Breite (width) von 720px und einer Höhe (height) von 1440px festgelegt. Im CSS-Style wiederum wurden für die mit Breite 1440px und die Höhe mit 2880 px angegeben. Das Canvas wird also durch die CSS-Formatierung doppelt so groß gezeichnet.
Weiterhin ist ein JavaScript-Dokument "main.js" eingebunden. Das Tutorial beginnt also mit dieser Ausgangssituation:

Der Context
Das Canvas-Element selbst stellt nur den Platz bereit. Um darauf zu malen, müssen wir über JavaScript den sogenannten Zeichenkontext (Context) holen.
Der Kontext ist eine Art Malwerkzeug, das uns Befehle bereitstellt, um Linien, Formen, Texte oder Bilder zu zeichnen sowie Farben und verschiedene Eigenschaften festzulegen.
main.js
Rechteck zeichnen
Wir können nun die Konstante "ctx", die den Kontext hält, zum Zeichnen eines Rechtecks nutzen.
Die Anweisung "strokeRect" zeichnet den Rand des Rechtecks.
Um einen rechteckigen Bereich zu löschen verwendet man "clearRect".
Die Füllfarbe wird der Eigenschaft "fillStyle" zugewiesen. Diese Farbe wird für alle folgenden Zeichenaktionen weiter beibehalten.
Die Strichfarbe bestimmt die Property: "strokeStyle". Farbangaben sind als CSS-Farbname, Hex-Code oder CSS-Farbfunktion möglich. Zusätzlich bestimmen wir die Linienbreite mit Hilfe der Eigenschaft "lineWidth".
Die Funktion save() speichert die bisherigen Werte der verschieden Properties z.b. die Strichfarbe, die Linienbreite und vieles mehr. Im unteren Beispiel werden die bisherigen Einstellungen gespeichert und StrokeStyle anschließend verändert. Nach dem Ändern werden die bisherigen Einstellungen mit restore() wiederhergestellt.
Am Ende dieses Abschnitts ergibt sich dieses Bild:

Formen nach Pfaden zeichnen
Ein Pfad wird mit "beginPath" gefolgt von "moveTo" bzw. "lineTo" festgelegt. Falls der Pfad geschlossen werden soll, kann die Anweisung "closePath" verwendet werden. Anschließend zeichnen "fill" bzw. "stroke" die Füllung bzw. den Rand.
Der obige Pfad zeichnet nun ein Dreieck hinzu. Im Bild sieht man nun auch die Wirkung der Anweisung "restore", denn die ursprüngliche Strichfarbe (blau) wurde wiederhergestellt.

Kreise zeichnen
Mit "arc" können Kreise gezeichnet werden. Dabei kann auch angegeben werden, ob gegen Uhrzeigerrichtung (counterclockwise) gezeichnet werden soll.
Mit der Angabe von "endAngle" und "startAngle" können Kreis auch nur teilweise gezeichnet werden. Die Winkel werden im Bogenmax angegeben, ein voll Umrundung geht als von 0 bis Pi * 2. Hier ein Halbkreis:
Mit "lineCap" wird der Linienabschluss bestimmt. Es ergibt sich bis hierher folgendes Bild:

Canvasgröße und Skalierung
Bei der Arbeit mit dem HTMLCanvas-Element gibt es einen fundamentalen Unterschied, der bei Anfängern oft zu unscharfen oder verzerrten Grafiken führt: Die Unterscheidung zwischen der internen Zeichenfläche und der Anzeigegröße.
Die Koordinatengröße (Zeichenfläche) wird direkt über die HTML-Attribute width und height definiert in diesem Tutorial sind das 720px mal 1440px. Hier wird bestimmt, wie viele Pixel zum Zeichnen zur Verfügung stehen. Der Standardwert ist 300 × 150 Pixel.
Die Anzeige-Größe (CSS-Größe) wird über CSS definiert, in diesem Tutorial sind das 1440px mal 2880px. Unsere Anzeige ist also doppelt so groß, wie die Zeichenfläche.
Es ist also wichtig beide Größen (Zeichenfläche und CSS-Größe) aufeinander abgestimmt zu bestimmen. Ansonsten kann das zu verzerrten, unscharfen oder verpixelten Grafiken führen.
Die CSS-Eigenschaft "image-rendering" bestimmt, wie der Browser das Canvas-Element hochskaliert (vergrößert) oder herunterskaliert. Das ist besonders wichtig, wenn die interne Zeichenfläche kleiner ist als die Anzeige-Größe im CSS. Durch Änderung dieser Eigenschaft im Style zu pixelated erscheinen unsere Formen schon um einiges schärfer.
Kreise und Bögen mit Pfaden verbinden
Kreise und Linien lassen sich auch einfach miteinander verbinden. Wir können auch die Art der Verbindung an den Schnittstellen durch "lineJoin" bestimmen.
Es ist mit "arcTo" auch möglich einen Kreisboden in den Pfad zu zeichnen.Zuvor legen wir fest, wie die Linie gestrichelt gezeichnet werden soll. Dazu wird ein Array mit der Strichlänge und dem Abstand zwischen den Strichen an die Anweisung "setLineDash" übergeben.
Kurven können auch noch freier als Bezierkurve gezeichnet werden. Sie dazu Bezierkurve auf Wikipedia
Am Ende dieses Abschnitts ergibt sich folgendes Bild mit Pfaden und verschiedenen Bögen, die teilweise gestrichelt dargestellt werden.

Farbverlauf
Auch Farbverläufe sind natürlich im Canvas möglich. Hier ein Beispiel mit LinearGradient. Der erzeugte Farbeverlauf wird einfach der "fillStyle"-Property zugewiesen.
Texte zeichnen
Am Ende darf natürlich Text nicht fehlen, denn auch das kann HTML-Canvas. Um den Text den gestrichelt zu zeichen, wird das LineDash-Array wieder leer gemacht. Hier nur ein paar Grundlagen, es gibt noch viel mehr Möglichkeiten.
Unser Bild wird nun noch um einen Farbverlauf und um Text ergänzt:

Bilder zeichnen
Beim Zeichnen von Bildern auf einem HTML Canvas gibt es drei wesentliche Aspekte: das Laden, die Performance und die Skalierung/Positionierung. Das wichtigste Werkzeug hierfür ist die Anweisung "drawImage".
Bilder können in Originalgröße, skaliert oder auch als Ausschnitt gezeichnet werden. Im Beispiel wird das Cover dieses Tutorials komplett ins Canvas gezeichnet. Wichtig ist hier, dass erst gezeichnet wird, wenn das Bild vollständig geladen ist, daher wir erst auf den Event onload gezeichnet.
Da das Bild für die Zeichenfläche zu groß ist, wird das Bild nur teilweise dargestellt. Gut, dass wir mit weiteren Parametern von "drawImage" auch skaliert zeichnen können.

Es ist auch möglich, nur einen Teil des Quellbildes auszuschneiden und skaliert ins Canvas zu zeichnen. Das ist ideal für Spritesheets in Spielen.

Fazit: Canvas Grundlagen
HTML Canvas ist ein mächtiges Werkzeug mit vielen Funktionen, um Grafik zu zeichnen und dabei jeden Pixel im Griff zu haben. Das Tutorial deckt nur die wichtigsten Funktionen ab. Ein weiteres Tutorial über die pixelgenau Manipulation der Bilddaten im Canvas folgt bald.