Habe ich nicht genug geschlafen oder was? Dieser folgende Code
var frame=document.getElementById("viewer");
frame.width=100;
frame.height=100;
var ctx=frame.getContext("2d");
var img=new Image();
img.src="http://www.ansearch.com/images/interface/item/small/image.png"
img.onload=function() {
// draw image
ctx.drawImage(img, 0, 0)
// Here's where the error happens:
window.open(frame.toDataURL("image/png"));
}
wirft diesen Fehler:
SECURITY_ERR: DOM Exception 18
Das sollte auf keinen Fall funktionieren! Kann das bitte jemand erklären?
javascript
html
canvas
cross-domain
pop850
quelle
quelle
Antworten:
In den Spezifikationen heißt es:
Wenn das Image von einem anderen Server stammt, können Sie toDataURL () nicht verwenden.
quelle
Das Festlegen des Cross-Origin-Attributs für die für mich verwendeten Bildobjekte (ich habe FabricJs verwendet)
Wenn Sie FabricJs verwenden, finden Sie hier Informationen zum Patchen von Image.fromUrl
quelle
Wenn das Image auf einem Host gehostet wird, auf dem entweder Access-Control-Allow-Origin oder Access-Control-Allow-Credentials festgelegt sind, können Sie Cross Origin Resource Sharing (CORS) verwenden. Weitere Informationen finden Sie hier (das Crossorigin-Attribut).
Sie können auch festlegen, dass Ihr Server über einen Endpunkt verfügt, der ein Image abruft und bereitstellt. (zB http: // your_host / endpoint? url = URL ) Der Nachteil dieses Ansatzes ist die Latenz und das theoretisch unnötige Abrufen.
Wenn es mehr alternative Lösungen gibt, wäre ich daran interessiert, davon zu hören.
quelle
Es scheint eine Möglichkeit zu geben, dies zu verhindern, wenn das Image-Hosting die folgenden HTTP-Header für die Bildressourcen bereitstellen kann und der Browser CORS unterstützt:
Es wird hier angegeben: http://www.w3.org/TR/cors/#use-cases
quelle
Endlich habe ich die Lösung gefunden. Nur muss der hinzufügen
crossOrigin
als dritte param infromURL
funcquelle
Ich hatte das gleiche Problem und alle Bilder werden in derselben Domain gehostet ... Wenn also jemand das gleiche Problem hat, habe ich Folgendes gelöst:
Ich hatte zwei Schaltflächen: eine zum Generieren der Leinwand und eine zum Generieren des Bildes aus der Leinwand. Es hat nur bei mir funktioniert, und es tut mir leid, dass ich nicht weiß warum, als ich den gesamten Code auf den ersten Button geschrieben habe. Wenn ich darauf klicke, werden gleichzeitig die Leinwand und das Bild generiert ...
Ich habe immer dieses Sicherheitsproblem, wenn die Codes unterschiedliche Funktionen hatten ... = /
quelle
Ich konnte es damit zum Laufen bringen:
Schreiben Sie dies in die erste Zeile Ihres
.htaccess
auf Ihrem QuellserverGehen Sie dann beim Erstellen eines
<img>
Elements wie folgt vor:quelle
Sie können keine Leerzeichen in Ihre ID einfügen
Aktualisieren
Ich vermute, dass sich das Image auf einem anderen Server befindet als auf dem Sie das Skript ausführen. Ich konnte Ihren Fehler duplizieren, als ich ihn auf meiner eigenen Seite ausführte, aber er funktionierte einwandfrei, als ich ein Bild verwendete, das auf derselben Domain gehostet wurde. Es ist also sicherheitsrelevant - platzieren Sie das Bild auf Ihrer Website. Weiß jemand warum das so ist?
quelle
Wenn Sie einfach einige Bilder auf eine Leinwand zeichnen, stellen Sie sicher, dass Sie die Bilder aus derselben Domäne laden.
www.example.com unterscheidet sich von example.com
Stellen Sie also sicher, dass Ihre Bilder und die URL in Ihrer Adressleiste identisch sind, www oder nicht.
quelle
Ich verwende Fabric.js und könnte dies beheben, indem ich toDatalessJSON anstelle von toDataURL verwende:
Edit: Nevermind. Dies führt dazu, dass nur das Hintergrundbild in JPG exportiert wird, ohne dass die Zeichnung oben angezeigt wird, sodass es schließlich nicht ganz nützlich war.
quelle