2011-12-31 3 views
7

私は次のコードスニペットを持っていると私は(XAMPPを実行しているOSX、)ローカルホストからそれを実行しようとしている:localhostのcontext.getImageData()?

var canvas = document.getElementById('mycanvas'); 
    var cx = canvas.getContext('2d'); 

    var myImg = new Image(); 
    myImg.src = 'images/lion.jpg'; 

    $(myImg).load(function() { 
     cx.drawImage(myImg, 0, 0); 
     var imgData = cx.getImageData(0,0,150,150); 
    }); 

しかし、私はそれを実行したとき、私は、コンソールからこのエラーを取得する:

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

私はここでいくつかの類似の質問を見つけました。これはローカルで作業しているという事実と関係しており、同じドメインから画像にアクセスしようとした場合は起こりません。これが理にかなっているかどうかはわかりませんが、それは私が理解していることです。

私の質問は、ローカルの開発環境でこの作業を行うにはどうすればいいですか?

答えて

23

HTTPサーバー(たとえば、ApacheまたはNginx)でhtmlを提供します。 Pythonがインストールされて

マックOSXが来るので、あなたは、単に、端末を開いて、HTTPサーバを起動することができ、その後、入力:ブラウザでhttp://localhost:8000/

cd /path/to/my/work/ 
python -m SimpleHTTPServer 

次に開きました。これはうまくいくはずです。

+0

チャームのように働いて、ありがとう! –

+2

いつも可能なわけではありません。これは、Autorun.inf経由でターゲットマシン上でローカルに実行されるCD上のサイトを置く場所にあるため、サーバーをセットアップしたり、ネットワークアクセスに依存したりすることができません)利用可能ですか? 他のすべてのブラウザで魅力を動作しますが、クロームコンソールで述べている: 悲しい回を「汚染されたキャンバスにエクスポートすることはできませんキネティック警告:データのURLを取得できません 『HTMLCanvasElement』オン 『toDataURL』を実行できませんでしたが。。」 –

+0

ループバック(127.0.0.1)ネットワークは常に利用できます。 – clowwindy

1

別のブラウザをお試しください。これがChromiumの私に起こりました。Firefoxに切り替えるだけで、ローカルでデバッグを続けることができました。

0

私は、ソリューションのコンボを使用して終了(this other problemを参照)

ステップ:

  1. base64文字列に画像を変換します。
  2. Image jsオブジェクトのsrcとして割り当てます。キャンバス上
  3. ドロー

コード:

// helper to transform to base64 
// see other question for more help 
function toDataUrl(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.responseType = 'blob'; 
    xhr.onload = function() { 
    var reader = new FileReader(); 
    reader.onloadend = function() { 
     callback(reader.result); 
    }; 
    reader.readAsDataURL(xhr.response); 
    }; 
    xhr.open('GET', url); 
    xhr.send(); 
} 

var canvas  = document.querySelector("canvas"); 
var ctx   = canvas.getContext("2d"); 
var png   = new Image(); 
var backgroundSrc = "....."; 

png.onload = function() { 
    ctx.drawImage(png, 0, 0); 
}; 

toDataUrl(backgroundSrc, function(base64Img) { 
    png.src = base64Img; 
}); 

私はこのソリューションは最適ではないですけど、それは私のために働いて画像が同じ起源から来ていないときに役立ちます。

同じ問題が発生した場合は誰でもこれを投稿しています。