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

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

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

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

JavaScript

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

Q&A

解決済

1回答

4083閲覧

【JavaScript】canvasの値をコピーする方法

flandre

総合スコア10

canvas

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

JavaScript

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

0グッド

0クリップ

投稿2021/09/25 09:02

編集2021/09/25 10:50

配列やオブジェクトを別の変数に代入するにあたって、値の格納場所を参照させるのではなく値そのものをコピーしたい場合はスプレッド構文が有効ですが、canvasの値をコピーしたい場合はどうすればよいのでしょうか?

Javascript

1const canvas = document.getElementById('canvas');//キャンバスを取得 2const ctx = canvas.getContext("2d");//コンテクストを取得 3 4let canvasData = canvas;//キャンバスの値を保存 5 6ctx.fillRect(50, 50, 50, 50);//適当にキャンバスをいじる 7 8ctx.drawImage(canvasData, 0, 0, canvas.width, canvas.height);//いじる前のキャンバスをここで描画したい

上記のような動作を実現したいのですが、実際にはいじった後のcanvasが描画されてしまいます。なので変数canvasDataにcanvasの値そのものをコピーし、その後canvasに操作を加えてもcanvasDataには影響が出ないようにしたいです

getImageDataを用いてイメージそのものをコピーすることも考えましたが、それだとdrawImageではなくputImageDataでしか描画できないのでやめました。サイズ変更などが可能なdrawImageでどうにか実現したいです

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

let canvasData = canvas.cloneNode(true);

で複製したらどうですか?


(追記)

わかりました。drawImageできるイメージが欲しいわけですね(質問にそう書いてますね)
canvas要素の複製は不要ですね。
これでどうでしょう。

<canvas id="canvas" width="200" height="200" style="background-color: black;"></canvas> <canvas id="another-canvas" width="500" height="500" style="background-color: black;"></canvas> <script> const canvas = document.getElementById('canvas'); // canvasに適当に描画 const ctx = canvas.getContext('2d'); ctx.fillStyle = "green"; ctx.fillRect(50, 50, 50, 50); // canvasに描画された内容をPNGデータ化して仮のimg要素に指定 const image = document.createElement("img"); image.src = canvas.toDataURL(); // another-canvasにdrawImage const anotherCanvas = document.getElementById('another-canvas'); anotherCanvas.getContext('2d').drawImage(image, 0, 0, anotherCanvas.width, anotherCanvas.height); </script>

投稿2021/09/25 09:14

編集2021/09/25 16:23
itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flandre

2021/09/25 10:50 編集

回答ありがとうございます 教えて頂いた通りやってみましたが、特に変化はありませんでした… 自分のやり方が何か間違っているのでしょうか? ↓以下コードです const canvas = document.querySelector('canvas'); const ctx = canvas.getContext('2d'); canvas.style.background = 'black'; let canvasData = canvas.cloneNode(true); ctx.fillStyle = "white"; ctx.fillRect(50, 50, 50, 50); ctx.drawImage(canvasData, 0, 0, canvas.width, canvas.height);
itagagaki

2021/09/25 13:24

やりたいことを私が理解できていない気もするのですが、canvasを複製しておいて、その複製のほうのコンテクストに描画するのではダメなのですか? const canvas = document.querySelector('canvas'); canvas.style.background = 'black'; let canvasData = canvas.cloneNode(true); // 要素を複製 document.body.appendChild(canvasData); // 複製を可視化してみるため入れました const ctx = canvasData.getContext('2d'); // 描画先として複製のほうのコンテクストを得る ctx.fillStyle = "white"; ctx.fillRect(50, 50, 50, 50); ctx.drawImage(canvasData, 0, 0, canvas.width, canvas.height);
flandre

2021/09/25 15:12

丁寧に対応して下さってありがとうございます この場合って既に色々描画したあとのキャンバスを複製することってできるんでしょうか?自分のコードだとそれが上手くいかなくて… 後から要件を追加するみたいになってしまって申し訳ないです。コピー(or複製)したいのは描画済みのキャンバスだったのですが、描画済みかどうかが影響を与えることはないと思って言及していませんでした。自分の説明不足です const canvas = document.querySelector('canvas'); const ctx = canvas.getContext('2d'); canvas.style.background = 'black'; ctx.fillStyle = "white"; ctx.fillRect(50, 50, 50, 50);//複製前に適当に描画 const canvasData = canvas.cloneNode(true);//canvasに行われた描画も複製したいのですが上手くいきません document.body.appendChild(canvasData); ctx.drawImage(canvasData, 0, 0, canvas.width, canvas.height);
itagagaki

2021/09/25 16:24

回答に追記しました。
flandre

2021/09/25 17:18

これです!ありがとうございます キャンバスをpng化するメソッドというのがあるんですね…勉強になりました 色々と親切に回答してくださって本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問