Ein Überblick über sein wie einen html5 Leinwand
CanvasRendingContext2D serialisiert
die Leinwand Kontext (CanvasRendingContext2D) hält die Leinwand Eigenschaften (Styling, aktuelle Transformation, usw.).
Wichtig! Der Kontext enthält nicht alle ausgeführten Zeichenbefehle, die den Canvas-Inhalt erstellt haben. Eigenschaften Kontext:
Färbung: stroke, fillStyle (1), globalAlpha,
Linienstile: linewidth, Linecap, lineJoin, miterLimit,
Textstile: Schriftart, TextAlign, TextBaseline,
Compositing: global,
Shadowing: shadow, shadowBlur, shadowOffsetX, shadowOffsetY
(1) fillStyle
ist in der Regel ein String ('# ff0000'), aber es kann Halte alternativ einen Verweis auf ein Farbverlaufsobjekt oder ein Musterobjekt. Um den fillStyle des Kontextes zu speichern, müssen Sie entweder Gradienten/Muster ignorieren oder die Gradienten-/Mustereigenschaften serialisieren.
Hier ist, wie Kontexteigenschaften in ein Objekt
var properties=['strokeStyle','lineWidth','font','globalAlpha',
'globalCompositeOperation','shadowColor','shadowBlur',
'shadowOffsetX','shadowOffsetY','lineCap','lineJoin',
'miterLimit','textAlign','textBaseline'];
var serializedContext={}
for(var i=0;i<properties.length;i++){
var prop=properties[i];
serializedContext[prop]=context[prop];
}
// fillStyle can be a headache
if(typeof context.fillStyle === 'string'){
serializedContext['fillStyle']=context.fillStyle;
}else{
// do lots more work to serialize gradient or pattern :-O
}
hier zu speichern, wie gespeicherte Kontexteigenschaften in einen neuen Kontext kopieren:
var context=myOtherCanvas.getContext('2d');
for(var i=0;i<properties.length;i++){
var prop=properties[i];
context[prop]=serializedContext[prop];
}
// fillStyle can be a headache
if(typeof context.fillStyle === 'string'){
serializedContext['fillStyle']=context.fillStyle;
}else{
// do lots more work to re-establish gradient or pattern :-O
}
Re-Ausführung der Zeichnungen
Wenn y Wenn Sie alle Zeichnungsbefehle erneut ausführen möchten, müssen Sie die Befehle und ihre Argumente speichern.
Von Ihrem Beispiel-Code, es sieht aus wie Ihre Zeichnungen Liniensegmente (moveTo
& lineTo
) beinhalten, so können Sie jedes Segment als Segment-Objekt in einem Array von Segment-Objekten speichern.
var segments=[];
segments.push({moveX:10, moveY:20, lineX:100, lineY:35});
... and push all the other line segments
Und dann können Sie „replay“ das Line-Segment Zeichenbefehle, nachdem Sie alle Kontexteigenschaften zurückgesetzt haben:
// redraw every line segment
ctx.beginPath()
for(var i=0;i<segments.length;i++){
var s=segments[i];
ctx.moveTo(s.moveX,s.moveY);
ctx.lineTo(s.lineX,s.lineY);
}
ctx.stroke();
Sie können auch serialisiert und Wiedergabe aller gängigen Zeichenbefehle (arc , beginPath, bezierCurveTo, clearRect, clip, closePath, füllen, fillRect, fillText, lineTo, moveTo, quadraticCurveTo, rect, wiederherstellen, drehen, speichern, skalieren, setTransform, stroke, strokeRect, strokeText, transformieren, übersetzen). Speichern Sie jeden Befehlsnamen & zugeordneten Argumente in einem Objekt und speichern Sie alle diese Befehlsobjekte in einem Array.
Diese Befehle geben Werte zurück, damit Sie sie benötigen, um mehr Arbeit zu handhaben: measureText, getImageData (putImageData), toDataURL, isPointInPath, isPointInStroke, create, createLinearGradient, createRadialGradient, create. Glücklicherweise werden diese Befehle seltener verwendet als die gebräuchlicheren (einfacheren) Befehle.
Über Portabilität
Wenn Sie diese Methode des Sparens alle Eigenschaften verwenden & Zeichnung in Objekt-Arrays Befehle, können Sie sie alle in JSON-Strings mit JSON.stringify
leicht serialisiert werden können und man kann sie leicht in Objekt-Arrays deserialisieren zurück mit JSON.parse
.
Wenn Sie Ihre Canvas-Eigenschaften & Zeichnungsbefehle serialisiert in Strings haben, können Sie sie einfach zum Speichern auf einen Server transportieren und sie dann zur Wiedergabe abrufen.
Und was ist dein Problem? – Kaiido
@Kaiido Ich bin mir nicht sicher, wie ich die Leinwand erneut auf das Element anwenden kann, wenn ich das CanvasRendingContext2D-Objekt vom "waveformCache" abrufe. '// canvas data hier zu cL element' wiederherstellen –
Sie meinen das Canvas Element? Es ist in der .canvas -Eigenschaft des Kontexts gespeichert – Kaiido