je suis en train d’écrire un script (ou d’éditer et de bidouiller des choses ensemble) pour éditer l’aspect des images sur une page. Je connais les bases du javascript, mais c’est la première fois que je regarde la toile. alors sois indulgent avec moi
Je reçois cette erreur:
Impossible d'obtenir des données d'image à partir du canevas car le canevas a été corrompu par des données croisées.
alors voici mon extrait de code jetant l'erreur:
var canvas = document.createElement('canvas'),
context = canvas.getContext('2d'),
height = img.naturalHeight || img.offsetHeight || img.height,
width = img.naturalWidth || img.offsetWidth || img.width,
imgData;
canvas.height = height;
canvas.width = width;
context.drawImage(img, 0, 0);
console.log(context);
try {
imgData = context.getImageData(0, 0, width, height);
} catch(e) {}
maintenant j'ai trouvé ce post:
http://bolsterweb.com/2012/06/grabbing-image-data-external-source-canvas-element/
mais je ne sais pas comment l'adapter à mes besoins.
Je sais que tout cela est dû à la sécurité et à tout cela - mais y a-t-il un moyen de tout faire pour que tout se produise?
Merci
EDIT
Oh, attendez .. l'erreur est due au fait que vous ne pouvez pas obtenirImageData .. il est donc possible de le rendre "local"
Pour satisfaire CORS, vous pouvez héberger vos images sur un site convivial pour CORS tel que dropbox.com.
Ensuite, l'erreur de sécurité ne sera pas déclenchée si vous spécifiez image.crossOrigin = "anonymous":
var image=new Image();
image.onload=function(){
}
image.crossOrigin="anonymous";
image.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/colorhouse.png";
Voici le code et un violon: http://jsfiddle.net/m1erickson/4djSr/
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
#canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var image=new Image();
image.onload=function(){
ctx.drawImage(image,0,0);
// desaturation colors
var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
var data=imgData.data;
for(var i = 0; i < data.length; i += 4) {
var grayscale= 0.33*data[i]+0.5*data[i+1]+0.15*data[i+2];
data[i]=grayscale;
data[i+1]=grayscale;
data[i+2]=grayscale;
}
// write the modified image data
ctx.putImageData(imgData,0,0);
}
image.crossOrigin="anonymous";
image.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/colorhouse.png";
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=140 height=140></canvas>
</body>
</html>
Je n'ai pas assez de réputation pour réellement ajouter un commentaire (mais j'en ai assez pour répondre à la question, hein ??), je voulais juste ajouter à la réponse de markE que je devais capitaliser sur Anonymous.
image.crossOrigin = "Anonymous"
J'ai trouvé que cela fonctionnait avec chrome si vous créez un raccourci Windows comme ceci:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files
Fermez chrome et lancez-le via votre raccourci.
Source: https://github.com/mrdoob/three.js/wiki/How-to-run-things-locally
Article connexe: Chargement de l'image d'origine croisée refusé sur une image locale avec THREE.js sur Chrome
Je suppose que vous travaillez avec un fichier local sans serveur Web.
Essayez d'ajouter crossorigin="anonymous"
à l'élément d'image. Par exemple
<img src="http://example.com/foo.jpg" crossorigin="anonymous"/>
Activer CORS côté serveur est une solution, mais si vous avez accès au serveur. De cette façon, le serveur sert des images activées par CORS.