###前提・実現したいこと
HTML5 Canvasで背景設定した画像に対して、
上から画像スタンプのように載せて保存するWebページを作っています。
色々なページを見ながらやり始めたばかりですが、一番最初の段階である、
背景画像に1つ目のスタンプを載せ、ドラッグで移動させる所までは、一応作ることができました。
しかし、そのスタンプを載せた状態のキャンバスをDLすることができません。
###発生している問題・エラーメッセージ
Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
###該当のソースコード
html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Drag</title> <style>#canvas {background: #666;}</style> </head> <body> <div> <canvas id="canvas" width="600" height="900"></canvas> </div> <script> (function() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var isDragging = false; var dragTarget = null; // ドラッグ対象の画像の添え字 var srcs = ['b.png','1.png']; var images = []; for (var i in srcs) { images[i] = new Image(); images[i].src = srcs[i]; } var loadedCount = 0; for (var i in images) { images[i].addEventListener('load', function() { if (++loadedCount == images.length) { for (var j in images) { // 画像を描画した時の情報を記憶 images[j].drawOffsetX = 0; images[j].drawOffsetY = 0; images[j].drawWidth = images[j].width; images[j].drawHeight = images[j].height; // 画像を描画 context.drawImage(images[j], 0, 0, images[j].width, images[j].height); } } }, false); } // ドラッグ開始 var mouseDown = function(e) { // ドラッグ開始位置 var posX = parseInt(e.clientX - canvas.offsetLeft); var posY = parseInt(e.clientY - canvas.offsetTop); // 当たり判定(ドラッグした位置が画像の範囲内に収まっているか) if (posX >= images[1].drawOffsetX && posX <= (images[1].drawOffsetX + images[1].drawWidth) && posY >= images[1].drawOffsetY && posY <= (images[1].drawOffsetY + images[1].drawHeight)) { dragTarget = 1; isDragging = true; } } // ドラッグ終了 var mouseUp = function(e) { isDragging = false; }; // canvasの枠から外れた var mouseOut = function(e) { // canvas外にマウスカーソルが移動した場合に、ドラッグ終了としたい場合はコメントインする // mouseUp(e); } // ドラッグ中 var mouseMove = function(e) { // ドラッグ終了位置 var posX = parseInt(e.clientX - canvas.offsetLeft); var posY = parseInt(e.clientY - canvas.offsetTop); if (isDragging) { // canvas内を一旦クリア context.clearRect(0, 0, canvas.width, canvas.height); for (var i in images) { if (i == dragTarget) { x = posX - images[i].drawWidth / 2; y = posY - images[i].drawHeight / 2; // ドラッグが終了した時の情報を記憶 images[i].drawOffsetX = x; images[i].drawOffsetY = y; } else { x = images[i].drawOffsetX; y = images[i].drawOffsetY; } w = images[i].drawWidth; h = images[i].drawHeight; // 画像を描画 context.drawImage(images[i], x, y, w, h); } } } // canvasにイベント登録 canvas.addEventListener('mousedown', function(e){mouseDown(e);}, false); canvas.addEventListener('mousemove', function(e){mouseMove(e);}, false); canvas.addEventListener('mouseup', function(e){mouseUp(e);}, false); canvas.addEventListener('mouseout', function(e){mouseOut(e);}, false); })(); function screenshot() { var canvas = document.getElementById("canvas"); var base64 = canvas.toDataURL(); var blob = Base64toBlob(base64); saveBlob(blob,"default.png"); } </script> <a href="#" onclick="screenshot();">screenshot</a> <script type="text/javascript" src="blob.js"></script> </body> </html>
JavaScript
function Base64toBlob(_base64) { var i; var tmp = _base64.split(','); var data = atob(tmp[1]); var mime = tmp[0].split(':')[1].split(';')[0]; var arr = new Uint8Array(data.length); for (i = 0; i < data.length; i++) {arr[i] = data.charCodeAt(i);} var blob = new Blob([arr], { type: mime }); return blob; } function saveBlob(_blob,_file) { if (false) { window.navigator.msSaveBlob(_blob, _file); } else { var url = (window.URL || window.webkitURL); var data = url.createObjectURL(_blob); var e = document.createEvent("MouseEvents"); e.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); var a = document.createElementNS("http://www.w3.org/1999/xhtml", "a"); a.href = data; a.download = _file; a.dispatchEvent(e); } } function ArraytoBlob(_mime,_array) { var arr = new Uint8Array(_array.length); for (var i = 0; i < _array.length; i++) {arr[i] = _array[i];} var blob = new Blob([arr], { type: _mime }); return blob; }
###試したこと
元々試作として、それぞれ別のHTMLとして一度作りましたが、DLの単体では問題ありませんでした。
また、ネットで『img.crossOrigin = "Anonymous";』と入れると解消するという情報があったので、images[i].crossOrigin = "Anonymous";という風に入れてみましたが、別のエラーコードが出た為、解決には至らず、質問させて頂きました。
どうかよろしくお願いいたします。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
まだ回答がついていません
会員登録して回答してみよう