Mein Code funktioniert auf meinem localhost sehr gut, aber auf der Site nicht.
Ich habe diesen Fehler von der Konsole für diese Zeile erhalten .getImageData(x,y,1,1).data
:
Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
Teil meines Codes:
jQuery.Event.prototype.rgb=function(){
var x = this.offsetX || (this.pageX - $(this.target).offset().left),y = this.offsetY || (this.pageY - $(this.target).offset().top);
if (this.target.nodeName!=="CANVAS")return null;
return this.target.getContext('2d').getImageData(x,y,1,1).data;
}
Hinweis: Meine Bild-URL (src) stammt aus einer Subdomain-URL
javascript
html
html5-canvas
Erfan Safarpoor
quelle
quelle
Antworten:
Wie andere gesagt haben, "beschmutzen" Sie die Leinwand, indem Sie sie aus einer Domäne mit unterschiedlichen Ursprüngen laden.
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
Möglicherweise können Sie dies jedoch verhindern, indem Sie einfach Folgendes einstellen:
Dies funktioniert nur, wenn der Remote-Server den folgenden Header entsprechend festlegt:
Die Dropbox-Dateiauswahl bei Verwendung der Option "Direkter Link" ist ein gutes Beispiel dafür. Ich verwende es auf oddprints.com , um Bilder von der Remote-Dropbox-Bild-URL in meine Zeichenfläche zu speichern und die Bilddaten dann wieder an meinen Server zu senden. Alles in Javascript
quelle
Ich stellte fest, dass ich
.setAttribute('crossOrigin', '')
einen Zeitstempel verwenden und an die Abfragezeichenfolge der URL anhängen musste, um zu vermeiden, dass einer 304-Antwort derAccess-Control-Allow-Origin
Header fehlt .Das gibt mir
quelle
imgObj.setAttribute('crossOrigin', '')
gelöst für mich - danke!img.crossOrigin = "Anonymous"
funktioniert auch (wie hier erwähnt ). @ SanfordStaab-Browser behandeln lokale Dateien als auf einer anderen Domain befindlich, andernfalls könnten Websitebesitzer Ihre lokalen Dateien lesen. Sie müssen Bilder von derselben Domain anfordern, oder die Header in der Antwort auf Ihre Anfrage müssen dem Browser mitteilen, dass Code aus anderen Domains diese Datei lesen kann.Sie können keine Bilder direkt von einem anderen Server in eine Zeichenfläche zeichnen und dann verwenden
getImageData
. Es ist ein Sicherheitsproblem und die Leinwand wird als "verdorben" betrachtet.Würde es für Sie funktionieren, eine Kopie des Images mit PHP auf Ihrem Server zu speichern und dann einfach das neue Image zu laden? Sie können beispielsweise die URL an das PHP-Skript senden und auf Ihrem Server speichern und dann den neuen Dateinamen wie folgt an Ihr Javascript zurückgeben:
Sie würden das PHP-Skript mit einem Ajax-Javascript wie dem folgenden verwenden:
Wenn Sie danach
getImageData
auf der Leinwand verwenden, funktioniert es einwandfrei.Wenn Sie nicht das gesamte Bild speichern möchten, können Sie alternativ x & y-Koordinaten an Ihr PHP-Skript übergeben und den rgba-Wert des Pixels auf dieser Seite berechnen. Ich denke, es gibt gute Bibliotheken für diese Art der Bildverarbeitung in PHP.
Wenn Sie diesen Ansatz verwenden möchten, lassen Sie mich wissen, wenn Sie Hilfe bei der Implementierung benötigen.
edit-1: Peeps wiesen darauf hin, dass das PHP-Skript verfügbar ist und das Internet es möglicherweise böswillig verwenden kann. Es gibt eine Million Möglichkeiten, damit umzugehen. Eine der einfachsten ist eine Art URL-Verschleierung. Ich denke, sichere PHP-Praktiken verdienen ein separates Google; P.
edit-2: Auf vielfachen Wunsch habe ich eine Prüfung hinzugefügt, um sicherzustellen, dass es sich um ein Bild und nicht um ein PHP-Skript handelt (von: PHP-Prüfung, ob die Datei ein Bild ist ).
quelle
Ich habe diesen Fehler gesehen,
Chrome
als ich meinen Code lokal getestet habe. Ich habe zu gewechseltFirefox
und sehe den Fehler nicht mehr. Vielleicht ist der Wechsel zu einem anderen Browser eine schnelle Lösung.Wenn Sie die in der ersten Antwort angegebene Lösung verwenden, stellen Sie sicher, dass Sie diese
img.crossOrigin = "Anonymous";
unmittelbar nach der Deklaration derimg
Variablen hinzufügen (z. B.var img = new Image();
).quelle
Ihr Problem ist, dass Sie ein externes Image laden, dh von einer anderen Domain. Dies führt zu einem Sicherheitsfehler, wenn Sie versuchen, auf Daten Ihres Canvas-Kontexts zuzugreifen.
quelle
Sie "beschmutzen" die Leinwand, indem Sie sie aus einer Domain mit unterschiedlichen Ursprüngen laden. Lesen Sie diesen MDN-Artikel:
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
quelle
Wenn Sie lokal arbeiten, fügen Sie einen Server hinzu
Ich hatte ein ähnliches Problem bei der Arbeit an lokalen. Ihre URL wird der Pfad zur lokalen Datei sein, z. B. Datei: ///Users/PeterP/Desktop/folder/index.html.
Bitte beachten Sie, dass ich auf einem MAC bin.
Ich habe dies umgangen, indem ich den http-Server global installiert habe. https://www.npmjs.com/package/http-server
Schritte:
npm install http-server -g
http-server ~/Desktop/folder/
PS: Ich gehe davon aus, dass Sie einen Knoten installiert haben, sonst werden Sie npm-Befehle nicht sehr weit ausführen.
quelle
Wie Matt Burns in seiner Antwort sagt , müssen Sie möglicherweise CORS auf dem Server aktivieren, auf dem die Problembilder gehostet werden.
Wenn der Server Apache ist, können Sie dazu das folgende Snippet (von hier ) entweder zu Ihrer VirtualHost-Konfiguration oder zu einer
.htaccess
Datei hinzufügen :... wenn Sie es einem VirtualHost hinzufügen, müssen Sie wahrscheinlich auch die Konfiguration von Apache neu laden (z. B.
sudo service apache2 reload
wenn Apache auf einem Linux-Server ausgeführt wird).quelle
Ich treffe heute das gleiche Problem und löse es durch den folgenden Code.
HTML Quelltext:
js code:
Code wie oben, und es gibt kein domänenübergreifendes Problem.
quelle
Ich hatte das gleiche Problem, und für mich funktionierte es durch einfaches Verketten
https:${image.getAttribute('src')}
quelle