質問:Canvasで使用されるクロスドメイン画像のCORS(クロスオリジンリソースシェアリング)ヘッダーをサポートするブラウザバージョンはどれですか?
CORSは、クロスドメインXMLHttpRequestsと画像リクエストの両方に適用できます。この質問は画像リクエストブラウザバージョンの互換性のために私の通常の行き先についてです http://caniuse.com/cors この問題とグーグル検索については不明です良い結果は得られません。
最近のchrome開発ブログは、CORSサポートが最新のブラウザーで広く普及しているが、WebGLのセキュリティ問題のために機能しなくなる可能性があることを示唆していることを発見しました。
http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
CORSの詳細:
W3Cワーキングドラフト http://www.w3.org/TR/cors/#use-cases で説明されているように、クロスドメイン画像リクエストでcanvas&CORSを使用する可能性を検討しています。 CORSは、フラッシュがcrossdomain.xmlを使用するのと同様の方法で、クロスドメインリソースの使用を可能にするためにhtmlキャンバスによって使用されます。基本的に、画像データのピクセルを読み取り/編集する必要があり、同じOriginプロキシサーバーを使用する必要はありません。
通常、画像がクロスドメインで読み込まれ、htmlキャンバスで使用されている場合、canvas.toDataURL()などの関数を使用してピクセルにアクセスするとセキュリティエラーがスローされます。ただし、イメージを配信するサーバーがこのようなヘッダーを追加する場合は、クロスドメインの使用を許可する必要があります。
access-control-allow-Origin: *
私たちが最も気にかけているブラウザ:
IEのフラッシュを使用したキャンバスサポートの欠如を回避することを計画しているため、CORSの問題があるデスクトップブラウザでも同様に行うことができますが、モバイルフラッシュではオプションではなく、プロキシを使用してリクエストを同じオリジンにすることはできませんユースケースのオプション。だから、私は特にAndriod、iPhone、CORSのIPADブラウザサポートに興味があります。
テスト結果:悪いニュースです。Chromeでのみ機能するようです。他のすべてのブラウザ(Android Mobileを含む)は次のようなエラーを出します:
Failed: DOM Exception: SECURITY_ERR (18)
モバイルデバイス私はAndroid(samsung galaxy kernel version 2.6.32.9)、IphoneおよびIPAD V1をテストしましたが、失敗しました3つすべて。
次のURLを使用して、独自のモバイルデバイスをテストできます。 http://maplarge.com/CrossOriginImageTest.html
テストスクリプト:
<!DOCTYPE html>
<html>
<head>
<title>Canvas Cross Origin Image Test: Testing for Canvas Cross Domain Image CORS Support</title>
<script type="text/javascript">
function initialize() {
//will fail here if no canvas support
try {
var can = document.getElementById('mycanvas');
var ctx = can.getContext('2d');
var img = new Image();
img.crossOrigin = '';
//domain needs to be different from html page domain to test cross Origin security
img.src = 'http://lobbydata.com/Content/images/bg_price2.gif';
} catch (ex) {
document.getElementById("results").innerHTML = "<span style='color:Red;'>Failed: " + ex.Message + "</span>";
}
//will fail here if security error
img.onload = function () {
try {
var start = new Date().getTime();
can.width = img.width;
can.height = img.height;
ctx.drawImage(img, 0, 0, img.width, img.height);
var url = can.toDataURL(); // if read succeeds, canvas isn't dirty.
//get pixels
var imgd = ctx.getImageData(0, 0, img.width, img.width);
var pix = imgd.data;
var len = pix.length;
var argb = []; //pixels as int
for (var i = 0; i < len; i += 4) {
argb.Push((pix[i + 3] << 24) + (pix[i] << 16) + (pix[i + 1] << 8) + pix[i + 2]);
}
var end = new Date().getTime();
var time = end - start;
document.getElementById("results").innerHTML = "<span style='color:Green;'>" +
"Success: Your browser supports CORS for cross domain images in Canvas <br>"+
"Read " + argb.length+ " pixels in "+ time+"ms</span>";
} catch (ex) {
document.getElementById("results").innerHTML = "<span style='color:Red;'>Failed: " + ex + "</span>";
}
}
}
</script>
</head>
<body onload="initialize()">
<h2>Canvas Cross Origin Image Test: Testing for Canvas Cross Domain Image CORS Support</h2>
<h2><a href="http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html">What is CORS Image Security?</a></h2>
<h1 id="results" style="color:Orange;">Testing...</h1>
<canvas id="mycanvas"></canvas>
<br />
<a href="/Example/List">More Examples</a>
</body>
</html>
SafariとChrome)の両方でiOS 6を実行しているiPhoneでこれをテストしたところ、テストページはテストに合格しました。コメントとして投稿したはずですが、投稿するオプションがありません。あなたの答えへのコメント。
以下の作業例では、phpを使用してCROSなしで必要なものをすべて取得できます。
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
function a(x){
alert(x);
var img = new Image();
img.onload = function()
{
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var context = canvas.getContext("2d");
context.fillStyle = "#ffffff";
context.fillRect(0,0,img.width,img.height);
context.drawImage(img, 0, 0);
var data = canvas.toDataURL('image/jpeg' , 0.8);
document.write('<img src="'+data+'" />');
};img.src = x;
}
</script>
<?php
$im = imagecreatefromjpeg('http://www.nasa.gov/images/content/711375main_grail20121205_4x3_946-710.jpg');
ob_start();
imagejpeg($im,NULL,100);
$outputBuffer = ob_get_clean();
$base64 = base64_encode($outputBuffer);
$x= 'data:image/jpeg;base64,'.$base64;
echo "<script>a('".$x."')</script>";
?>