Mon code fonctionne très bien sur mon hôte local mais il ne fonctionne pas sur le site.
J'ai eu cette erreur 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.
une 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 d'image (src) provient d'une URL de sous-domaine
javascript
html
html5-canvas
Erfan Safarpoor
la source
la source
Réponses:
Comme d'autres l'ont dit, vous «souillez» le canevas en le chargeant à partir d'un domaine d'origines croisées.
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
Cependant, vous pourrez peut-être éviter cela en définissant simplement:
Cela ne fonctionne que si le serveur distant définit correctement l'en-tête suivant:
Le sélecteur de fichiers Dropbox lors de l'utilisation de l'option "lien direct" en est un excellent exemple. Je l'utilise sur oddprints.com pour aspirer des images de l'URL de l'image de dropbox distante, dans ma toile, puis soumettre les données d'image à mon serveur. Tout en javascript
la source
J'ai trouvé que je devais utiliser
.setAttribute('crossOrigin', '')
et ajouter un horodatage à la chaîne de requête de l'URL pour éviter une réponse 304 sans en-Access-Control-Allow-Origin
tête.Cela me donne
la source
imgObj.setAttribute('crossOrigin', '')
résolu pour moi - merci!img.crossOrigin = "Anonymous"
fonctionne également (comme mentionné ici ). Les navigateurs @SanfordStaab traitent les fichiers locaux comme appartenant à un domaine différent, sinon les propriétaires de sites Web pourraient lire vos fichiers locaux. Vous devez demander des images du même domaine, ou les en-têtes de la réponse à votre demande doivent indiquer au navigateur que le code d'autres domaines est autorisé à lire ce fichier.Vous ne pourrez pas dessiner des images directement à partir d'un autre serveur dans un canevas, puis les utiliser
getImageData
. C'est un problème de sécurité et la toile sera considérée comme "corrompue".Cela fonctionnerait-il pour vous d'enregistrer une copie de l'image sur votre serveur en utilisant PHP, puis de charger simplement la nouvelle image? Par exemple, vous pouvez envoyer l'URL vers le script PHP et l'enregistrer sur votre serveur, puis renvoyer le nouveau nom de fichier à votre javascript comme ceci:
Vous utiliseriez le script PHP avec du javascript ajax comme celui-ci:
Si vous utilisez
getImageData
sur la toile après cela, cela fonctionnera bien.Alternativement, si vous ne voulez pas enregistrer l'image entière, vous pouvez passer les coordonnées x & y à votre script PHP et calculer la valeur rgba du pixel de ce côté. Je pense qu'il existe de bonnes bibliothèques pour faire ce genre de traitement d'image en PHP.
Si vous souhaitez utiliser cette approche, faites-moi savoir si vous avez besoin d'aide pour la mettre en œuvre.
edit-1: peeps a souligné que le script php est exposé et permet à Internet de l'utiliser potentiellement de manière malveillante. il existe un million de façons de gérer cela, l'une des plus simples étant une sorte d'obfuscation d'URL ... Je pense que les pratiques php sécurisées méritent un google séparé; P
edit-2: à la demande générale, j'ai ajouté une vérification pour m'assurer qu'il s'agit d'une image et non d'un script php (à partir de: PHP vérifier si le fichier est une image ).
la source
Je voyais cette erreur pendant
Chrome
que je testais mon code localement. Je suis passé àFirefox
et je ne vois plus l'erreur. Peut-être que passer à un autre navigateur est une solution rapide.Si vous utilisez la solution donnée dans la première réponse, assurez-vous d'ajouter
img.crossOrigin = "Anonymous";
juste après avoir déclaré laimg
variable (par exemplevar img = new Image();
).la source
Votre problème est que vous chargez une image externe, c'est-à-dire depuis un autre domaine. Cela provoque une erreur de sécurité lorsque vous essayez d'accéder aux données de votre contexte de canevas.
la source
Vous «souillez» le canevas en le chargeant à partir d'un domaine d'origines croisées. Consultez cet article MDN:
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
la source
Lorsque vous travaillez en local, ajoutez un serveur
J'ai eu un problème similaire en travaillant sur local. Votre URL va être le chemin vers le fichier local, par exemple file: ///Users/PeterP/Desktop/folder/index.html.
Veuillez noter que je suis sur un MAC.
J'ai contourné cela en installant le serveur http globalement. https://www.npmjs.com/package/http-server
Pas:
npm install http-server -g
http-server ~/Desktop/folder/
PS: Je suppose que vous avez installé un nœud, sinon vous n'obtiendrez pas très loin les commandes npm.
la source
Comme le dit Matt Burns dans sa réponse , vous devrez peut-être activer CORS sur le serveur où les images problématiques sont hébergées.
Si le serveur est Apache, cela peut être fait en ajoutant l'extrait de code suivant (à partir d' ici ) à votre configuration VirtualHost ou à un
.htaccess
fichier:... si vous l'ajoutez à un VirtualHost, vous devrez probablement également recharger la configuration d'Apache (par exemple,
sudo service apache2 reload
si Apache fonctionne sur un serveur Linux)la source
Mon problème était tellement compliqué que j'ai simplement encodé l'image en base64 pour m'assurer qu'il ne pouvait pas y avoir de problèmes CORS
la source
Je rencontre le même problème aujourd'hui, et je le résolve par le code suivant.
Code HTML:
code js:
code comme ci-dessus, et il n'y a pas de problème interdomaine.
la source
J'avais le même problème, et pour moi, cela fonctionnait simplement en concaténant
https:${image.getAttribute('src')}
la source