Comment réparer getImageData() erreur de La toile a été entachée par la croix-données sur l'origine?
Mon code fonctionne très bien sur mon localhost, mais il ne fonctionne pas sur le site.
J'ai eu cette erreur à partir de la console, pour cette ligne .getImageData(x,y,1,1).data
:
Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
partie de mon code:
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;
}
Remarque: mon url de l'image (src) est un sous-domaine url
- J'obtiens cette erreur même lorsque l'img.src est une url relative: "img/foo.png" - alors, qu'est-ce que la croix-de l'origine à ce sujet?
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont dit vous êtes "altération" de la toile par le chargement à partir d'une croix origines de domaine.
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
Cependant, vous pouvez être en mesure d'empêcher cela en définissant simplement:
Cela ne fonctionne que si le serveur distant définit l'en-tête suivant de façon appropriée:
La Dropbox sélecteur de fichier lors de l'utilisation du "lien direct" est un bon exemple de cela. Je l'utilise sur oddprints.com à hoover images à partir de la télécommande dropbox url de l'image, dans ma toile, et ensuite soumettre les données d'image sur mon serveur. Tous en javascript
J'ai trouvé que j'ai eu à utiliser
.setAttribute('crossOrigin', '')
et avait pour ajouter un horodatage à l'adresse URL de la chaîne de requête, afin d'éviter une réponse 304 manque laAccess-Control-Allow-Origin
en-tête.Cela me donne
imgObj.setAttribute('crossOrigin', '')
résolu pour moi - merci!img.crossOrigin = "Anonymous"
fonctionne aussi bien (comme indiqué ici). @SanfordStaab Navigateurs traiter les fichiers locaux comme étant sur un autre domaine, sinon les propriétaires de site web pouvait lire vos fichiers locaux. Vous avez besoin de demander des images à partir du même domaine, ou les en-têtes de la réponse à votre demande besoin de dire au navigateur que c'est ok pour le code à partir d'autres domaines de lire ce fichier.Vous ne serez pas en mesure de dessiner des images directement à partir d'un autre serveur dans une zone de dessin, puis utiliser
getImageData
. C'est un problème de sécurité et la toile sera considéré comme "corrompus".Serait-il travailler pour vous pour enregistrer une copie de l'image sur votre serveur à l'aide de PHP et ensuite il suffit de charger la nouvelle image? Par exemple, vous pouvez envoyer l'URL du script PHP et de l'enregistrer sur votre serveur, puis retourner le nouveau nom de fichier dans votre javascript comme ceci:
Que vous souhaitez utiliser le script PHP avec ajax javascript comme ceci:
Si vous utilisez
getImageData
sur la toile après que, cela fonctionnera très bien.Alternativement, si vous ne voulez pas sauvegarder l'ensemble de l'image, vous pouvez passer x & y les coordonnées de votre script PHP, et de calculer le pixel de valeur rgba sur le côté. Je pense qu'il y a de bonnes bibliothèques pour faire ce genre de traitement d'image en PHP.
Si vous souhaitez utiliser cette approche, laissez-moi savoir si vous avez besoin d'aider à les mettre en œuvre.
edit: jette un coup d'oeil a souligné que le script php est exposé et permet à l'internet pour éventuellement l'utiliser à des fins malveillantes. il ya un million de façons de gérer cette situation, l'un des plus simple étant une sorte de URL de la dissimulation de l'... je pense sécurisé php pratiques mérite une google ;P
Votre problème est que vous chargez une image externe, la signification à partir d'un autre domaine. Cela provoque un message d'erreur lorsque vous essayez d'accéder à toutes les données de votre toile contexte.
Vous êtes "altération" de la toile par le chargement à partir d'une croix origines de domaine. Découvrez ce MDN article:
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
J'ai vu cette erreur sur
Chrome
alors que je testais mon code en local. Je suis passé àFirefox
et je ne vois pas l'erreur, pas plus. Peut-être passer à un autre navigateur est une solution rapide.Si vous utilisez la solution donnée dans la première réponse, alors assurez-vous d'ajouter
img.crossOrigin = "Anonymous";
juste après la déclaration de laimg
variable (pour exemple.var img = new Image();
).Lorsque l'on travaille sur local ajouter un serveur
J'ai eu un problème similaire lors du travail local. Vous url va être le chemin d'accès vers le fichier local par exemple file:///Users/PeterP/Desktop/folder/index.html.
Veuillez noter que je suis sur un MAC.
Je suis ronde par l'installation de serveur http à l'échelle mondiale. https://www.npmjs.com/package/http-server
Suit:
npm install http-server -g
http-server ~/Desktop/folder/
PS: je suppose que vous avez nœud installé, sinon on ne pourra pas aller très loin l'exécution de mnp commandes.
Comme matt burns dit dans sa réponse, vous devrez peut-être activer la SCRO sur le serveur où le problème des images sont hébergées.
Si le serveur est Apache, cela peut être fait en ajoutant l'extrait de code suivant (à partir de ici) à votre VirtualHost config ou un
.htaccess
fichier:...si l'ajout d'un serveur Virtuel, vous aurez probablement besoin de recharger Apache config de trop (par exemple.
sudo service apache2 reload
si Apache est en cours d'exécution sur un serveur Linux)Je rencontre le même problème aujourd'hui, et de le résoudre par le code de la façon suivante.
code html:
code js:
code comme ci-dessus, et il n'y a pas de contre-problème de domaine.
J'ai eu le même problème, et pour moi, il a travaillé par simplement concaténer
https:${image.getAttribute('src')}