質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

解決済

toDataURL()が上手く動作しない。

yoshiz
yoshiz

総合スコア7

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1回答

0評価

1クリップ

8483閲覧

投稿2017/10/02 23:36

###前提・実現したいこと
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/ツール等のバージョンなど)
より詳細な情報

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。