2013-01-21 35 views
10

イメージから色を取得するのにhtml5 Canvasを使用しています。このために私はJavaScriptで次のコードを書いた:キャンバスがクロスオリジンデータによって汚染されているため、キャンバスからイメージデータを取得できません

http://jsfiddle.net/8dQSS/1/(Plsの例外を確認するために、コンソールをチェックしてください)上記のコードは、次の例外をスローして

function getImageColor() { 
    var colors = []; 
    var image = new Image(); 

    image.onload = function() { 
     var canvas = document.createElement("canvas"); 
     canvas.width = image.width; 
     canvas.height = image.height; 

     // Draw the image in canvas 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(image, 0, 0); 

     // Get the pixel data 
     var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 

     // Loop through imageData.data - an array with 4 values per pixel: red, green, blue, and alpha 
     for (var x = 0; x < imageData.width; x++) { 
      for (var y = 0; y < imageData.height; y++) { 
       var index = 4 * (y * imageData.width + x); 
       var r = imageData.data[index]; 
       var g = imageData.data[index + 1]; 
       var b = imageData.data[index + 2]; 
       var a = imageData.data[index + 3]; 

       colors.push("rgb(" + r + "," + g + "," + b + ")"); 
      } 
     } 
    }; 
    image.src = "http://www.xxxxxxxxxxxx.com/demos/assets/image.jpg"; 
} 

Unable to get image data from canvas because the canvas has been tainted by cross-origin data. 
Uncaught Error: SECURITY_ERR: DOM Exception 18 

は誰でもできこの問題の解決方法を教えてください。

+1

を固定していましたか? – Bergi

+0

多分、それは診断するのに役立つでしょう(これは古い投稿です)。私はキャンバスから、私はSVG要素から作成されたデータURIから自分自身を生成しました。 FFとSafariでうまく動作します。 – LeeGee

+0

SVG要素からJavaScriptを使って動的に作成した画像からこれを取得し、データURIとして渡します。それは苦痛で、「Uncaught SecurityError:ユーザエージェントのセキュリティポリシーを突破しようとしました」と言っています。クロムも賢明にしようとしていますか? – LeeGee

答えて

4

私が知っている唯一の解決策は、ロードする画像をファイルと同じサーバーにホストすることです。キャンバスからWeb上の任意の画像にアクセスして処理することはできません。

編集:したい場合は、like thisを実行します。

11

ファイルシステムでこれを使用していますか?はいの場合は、サーバー(localhost)で実行します。

+0

ありがとう!これは私が必要としていたものです – Maccle415

2

私はこの同じエラーが発生しました。私はキャンバスに多くのを検索しました。最初の解決策は、img.crossOrigin='anonymous'を追加することでした。しかし、まだ問題は残っている。私はs3が提供する資産を使用していましたが、これをバケットポリシーに追加する問題を修正しました。バケツから

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
    { 
     "Sid": "AllowPublicRead", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::seu-candidato/*" 
    } 
    ] 
} 

資産はX-Amz-ExpiresX-Amz-Dateのようないくつかのparamsは、私はそれらを削除し、私の問題WSはその内容あなたがアクセスすることを許可されていない他のドメインからの画像を使用しないでください

関連する問題