質問するログイン新規登録

質問編集履歴

2

削除された内容の復元を行いました

2020/07/21 06:19

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- あがcsばghにあ
1
+ Canvasの保存(塗り絵アプリで線画と描画のふたつのCanvasを合成したものを保存した
body CHANGED
@@ -1,1 +1,301 @@
1
+ ### 前提・実現したいこと
2
+ ブラウザ上で起動する塗り絵を作成しています。
3
+ 見様見真似ですが、htmlとjavascriptで、
4
+ 線画を表示するcanvasの下に描画用のcanvasを置いています。
5
+ 最終的には、作成者がその完成画像をダウンロードできるようにすることです。
6
+ ### 発生している問題・エラーメッセージ
7
+ 画像を保存させる方法がわかりません。
8
+ 調べて、以下のコードを入れ込みました。
9
+ html↓
10
+ ```
11
+ <button onclick="downloadCanvas()">ダウンロード</button>
12
+ <a id="hiddenLink" download="canvas.png">link</a>
13
+ <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
14
+ <img id="canvasImage" src="dummy.png">
15
+ ```
16
+ script↓
17
+ ```
18
+ function downloadCanvas() {
19
+ let canvas = document.getElementById('canvas')
20
+ let link = document.getElementById('hiddenLink')
21
+ link.href = canvas.toDataURL()
22
+ document.getElementById('canvasImage').src = canvas.toDataURL()
23
+ link.click()
24
+ ```
25
+ しかし、線画用のcanvasと描画用のcanvasが別々なので、
26
+ それを合成した完成形をダウンロードさせることができません。
27
+ IdのところをいずれかのIdにすれば、どちらかをダウンロードさせることはできます。
28
+ 合成した第3のcanvasを作る必要があるのかと思うのですが、やり方がわかりません。
29
+ なにかお分かりになる方お教えいただけば幸いです。
30
+ よろしくお願いいたします。
31
+ ### ソースコード全体
32
+ ```ここに言語名を入力
33
+ <!DOCTYPE html>
34
+ <html>
35
+ <head>
36
+ <meta charset="utf-8">
37
+ <title>ぬり絵テスト</title>
38
+ <style type="text/css">
39
+ /* h1のCSS */
40
+ h1 {
41
+ margin-left: 50px;
42
+ color: #cccccc;
43
+ }
44
+ /* キャンバスのCSS */
45
+ #canvas {
46
+ border: solid 1px #cccccc;
47
+ margin: 0px 50px;
48
+ width: 690px;
49
+ height: 380px;
50
+ position: relative;
51
+ }
52
+ #coloring {
53
+ top: 0px;
54
+ left: 0px;
55
+ position: absolute;
56
+ z-index: 1;
57
+ }
58
+ /* 上に重ねる画像 */
59
+ #overImage {
60
+ top: 0px;
61
+ left: 0px;
62
+ position: absolute;
63
+ z-index: 2;
64
+ }
65
+ /* カラーパレットのCSS */
66
+ #palette {
67
+ margin: 0px 50px;
68
+ padding: 0px;
69
+ width: 690px;
70
+ }
71
+ /* 色ボタンのCSS */
72
+ .Color {
73
+ margin: 5px;
74
+ padding: 0px;
75
+ width: 30px;
76
+ height: 30px;
77
+ border: solid 1px #CCCCCC;
78
+ }
79
+ /* ペンサイズ */
80
+ #penWidth {
81
+ margin: 50px;
82
+ padding: 0px;
83
+ float: left;
84
+ }
85
+ #penWidth button {
86
+ border: none;
87
+ background-color: #FFFFFF;
88
+ width: 30px;
89
+ height: 30px;
90
+ padding: 0px;
91
+ }
92
+ .penSize {
93
+ border-radius: 50%;
94
+ background-color: #000000;
95
+ border: solid 1px #CCCCCC;
96
+ margin: auto;
97
+ }
98
+ #penSizeL {
99
+ width: 20px;
100
+ height: 20px;
101
+ }
102
+ #penSizeM {
103
+ width: 10px;
104
+ height: 10px;
105
+ }
106
+ #penSizeS {
107
+ width: 5px;
108
+ height: 5px;
109
+ }
110
+ /* ペン濃度 */
111
+ #penAlpha {
112
+ margin: 50px;
113
+ padding: 0px;
114
+ float: left;
115
+ }
116
+ #hiddenLink{
117
+ display: none;
118
+ }
119
+ </style>
120
+ </head>
121
+ <body>
122
+ <!-- タイトルを表示する -->
123
+ <h1>ぬり絵テスト</h1>
124
+ <!-- キャンバスを置く -->
125
+ <div id="canvas">
126
+ <canvas id="overImage" width="690" height="380"></canvas>
127
+ <canvas id="coloring" width="690" height="380"></canvas>
128
+ </div>
129
+ <!-- カラーパレット -->
130
+ <div id="palette">カラーパレット<br />
131
+ </div>
132
+ <blockquote id="penWidth">ペン先<br />
133
+ <button type="button" onClick="setPenSize('20')"><div class="penSize" id="penSizeL"></div></button>
134
+ <button type="button" onClick="setPenSize('10')"><div class="penSize" id="penSizeM"></div></button>
135
+ <button type="button" onClick="setPenSize('3' )"><div class="penSize" id="penSizeS"></div></button>
136
+ </blockquote>
137
+ <canvas id="coloring"></canvas>
138
+ <div>
139
+ <button onclick="downloadCanvas()">ダウンロード</button>
140
+
141
+ <a id="hiddenLink" download="canvas.png">link</a>
142
+ <!-- CSSで「display: none;」して非表示 -->
143
+ <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
144
+ <img id="canvasImage" src="dummy.png">
145
+ <!-- CSSで小さめサイズに調整 -->
146
+ </div>
147
+ </body>
148
+ <script type="text/javascript">
149
+ // キャンバスを取得
150
+ var canvas = document.getElementById("canvas");
151
+ // 色塗り用
152
+ var coloring = document.getElementById('coloring');
153
+ // コンテキストを取得
154
+ var ctx = coloring.getContext('2d');
155
+ // カラーパレット取得
156
+ var palette = document.getElementById('palette');
157
+ // ペンサイズ
158
+ var penSizeButtons = document.getElementsByClassName('penSize');
159
+ // マウス位置
160
+ var mouse = {x:0, y:0, bx:0, by:0};
161
+ // クリック中フラグ
162
+ var isClicked = false;
163
+ // ペン色
164
+ var penColor = "#000000";
165
+ // ペン幅
166
+ var penWidth = 10;
167
+ // ペン濃度
168
+ var penAlpha = 1.0;
169
+ // 画像をキャンバスの上に描画する
170
+ setImage()
171
+ // 塗り絵の元を表示
172
+ function setImage() {
173
+ var overCanvas = document.getElementById('overImage');
174
+ var overCtx = overCanvas.getContext('2d');
175
+ /* Imageオブジェクトを生成 */
176
+ var img = new Image();
1
- aaqfワエdrfty樹kdんtmキィmhtんgbfvd差cbgr縫いうyhんdsvbgんm,。・お;lkjhgfdsvzxdvfbnytukiloiujmdsvacabgnmyil,yu
177
+ img.src="/div/shisetsu1/img/nanjamonja.png";
178
+ img.onload = function() {
179
+ overCtx.drawImage(img, 0, 0)
180
+ }
181
+ console.log("setImage")
182
+ }
183
+ // 実行
184
+ setColorPalette()
185
+ var suportTouch = 'ontouchend' in document;
186
+ var startEvent = suportTouch ? "touchstart" : "mousedown";
187
+ var moveEvent = suportTouch ? "touchmove" : "mousemove";
188
+ var endEvent = suportTouch ? "touchend" : "mouseup";
189
+ // マウスイベントを取得
190
+ // マウスクリック
191
+ canvas.addEventListener(startEvent, function(e){
192
+ if (suportTouch) {
193
+ event.preventDefault(); // タッチによる画面スクロールを止める
194
+ }
195
+ startDraw(e);
196
+ });
197
+ // マウス移動
198
+ canvas.addEventListener(moveEvent, function(e){
199
+ drawing(e);
200
+ });
201
+ // マウスクリック解除
202
+ canvas.addEventListener(endEvent, function(e){
203
+ endDraw(e)
204
+ });
205
+ // ポジション閑散
206
+ function getPosition(e) {
207
+ // キャンバスの位置とサイズを取得
208
+ var rect = e.target.getBoundingClientRect();
209
+ if (suportTouch) {
210
+ // マウスの位置
211
+ mouse.x = e.touches[0].clientX - rect.left;
212
+ mouse.y = e.touches[0].clientY - rect.top;
213
+ } else {
214
+ // マウスの位置
215
+ mouse.x = e.clientX - rect.left;
216
+ mouse.y = e.clientY - rect.top;
217
+ }
218
+ }
219
+ // 線引き開始
220
+ function startDraw(e) {
221
+ // キャンバスの位置とサイズを取得
222
+ getPosition(e);
223
+ // 描画の開始
224
+ drarLineStart();
225
+ // クリック中フラグ
226
+ isClicked = true;
227
+ };
228
+ // 線引き続行
229
+ function drawing(e) {
230
+ // クリック中以外の時は無視
231
+ if(!isClicked) {
232
+ return;
233
+ }
234
+ // 一つ前の位置
235
+ mouse.bx = mouse.x;
236
+ mouse.by = mouse.y;
237
+ // キャンバスの位置とサイズを取得
238
+ getPosition(e);
239
+ // クリック中なら線を引く
240
+ drawLine();
241
+ };
242
+ // 線引き完了
243
+ function endDraw(e) {
244
+ // クリック終了
245
+ isClicked = false;
246
+ };
247
+ // 開始位置を指定
248
+ function drarLineStart() {
249
+ // 線の太さを指定
250
+ ctx.lineWidth = penWidth;
251
+ // 線の色を指定
252
+ ctx.strokeStyle = penColor;
253
+ ctx.globalAlpha = penAlpha;
254
+ // 先端を丸くする
255
+ ctx.lineCap = "round"
256
+ // つなぎ目を丸くする
257
+ ctx.lineJoint = "round"
258
+ }
259
+ // 線を引く
260
+ function drawLine() {
261
+ // 今からパスを書きますよと云う宣言
262
+ ctx.beginPath();
263
+ // パスの開始点に移動
264
+ ctx.moveTo(mouse.bx, mouse.by);
265
+ // 指定の位置までパスを引く
266
+ ctx.lineTo(mouse.x, mouse.y);
267
+ // パスに線を載せる
268
+ ctx.stroke();
269
+ }
270
+ // カラーパレットを配置する
271
+ function setColorPalette() {
272
+ var colors = ['#FFFFFF', '#000000', '#B45F04', '#FE2E2E', '#FE642E', '#FE9A2E', '#FACC2E',
273
+ '#F7FE2E', '#C8FE2E', '#64FE2E', '#2EFEC8', '#2ECCFA', '#2E9AFE',
274
+ '#642EFE', '#9A2EFE', '#CC2EFA', '#FE2EC8',
275
+ '#F5A9A9', '#F5BCA9', '#F5D0A9', '#F3E2A9', '#E1F5A9', '#A9F5A9', '#A9F5A9', '#A9F5E1',
276
+ '#A9E2F3', '#A9D0F5', '#A9BCF5', '#A9A9F5', '#BCA9F5', '#D0A9F5',
277
+ '#F5A9F2', '#F5A9D0', '#F5A9BC'];
278
+ for(var i = 0; i < 34; i++) {
279
+ var btn = "<button class='Color' style='background-color: " + colors[i] + ";' onClick='setPenColor(\"" + colors[i] + "\");'></button>"
280
+ palette.innerHTML += btn;
281
+ }
282
+ }
283
+ // 色を変更する
284
+ function setPenColor(setColor) {
285
+ penColor = setColor;
286
+ // ペンの色を変える
287
+ for(var i = 0; i < penSizeButtons.length; i++) {
288
+ penSizeButtons[i].style.backgroundColor = setColor;
289
+ }
290
+ }
291
+ // 線幅を変更する
292
+ function setPenSize(size) {
293
+ penWidth = size;
294
+ }
295
+ // 線の濃さを変更する
296
+ function setPenAlpha(alpha) {
297
+ penAlpha = alpha;
298
+ }
299
+ </script>
300
+ </html>
301
+ ```

1

htfgnybdsvwfed

2020/07/21 06:19

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- Canvasの保存(塗り絵アプリで線画と描画のふたつのCanvasを合成したものを保存した
1
+ あがcsばghにあ
body CHANGED
@@ -1,356 +1,1 @@
1
- ### 前提・実現したいこと
2
-
3
- ブラウザ上で起動する塗り絵を作成しています。
4
- 見様見真似ですが、htmlとjavascriptで、
5
- 線画を表示するcanvasの下に描画用のcanvasを置いています。
6
- 最終的には、作成者がその完成画像をダウンロードできるようにすることです。
7
-
8
- ### 発生している問題・エラーメッセージ
9
-
10
- 画像を保存させる方法がわかりません。
11
- 調べて、以下のコードを入れ込みました。
12
-
13
- html↓
14
- ```
15
- <button onclick="downloadCanvas()">ダウンロード</button>
16
- <a id="hiddenLink" download="canvas.png">link</a>
17
- <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
18
- <img id="canvasImage" src="dummy.png">
19
- ```
20
- script↓
21
- ```
22
- function downloadCanvas() {
23
- let canvas = document.getElementById('canvas')
24
- let link = document.getElementById('hiddenLink')
25
- link.href = canvas.toDataURL()
26
-
27
- document.getElementById('canvasImage').src = canvas.toDataURL()
28
-
29
- link.click()
30
- ```
31
-
32
- しかし、線画用のcanvasと描画用のcanvasが別々なので、
33
- それを合成した完成形をダウンロードさせることができません。
34
- IdのところをいずれかのIdにすれば、どちらかをダウンロードさせることはできます。
35
- 合成した第3のcanvasを作る必要があるのかと思うのですが、やり方がわかりません。
36
- なにかお分かりになる方お教えいただけば幸いです。
37
- よろしくお願いいたします。
38
-
39
- ### ソースコード全体
40
-
41
- ```ここに言語名を入力
42
-
43
- <!DOCTYPE html>
44
- <html>
45
- <head>
46
- <meta charset="utf-8">
47
- <title>ぬり絵テスト</title>
48
- <style type="text/css">
49
- /* h1のCSS */
50
- h1 {
51
- margin-left: 50px;
52
- color: #cccccc;
53
- }
54
-
55
- /* キャンバスのCSS */
56
- #canvas {
57
- border: solid 1px #cccccc;
58
- margin: 0px 50px;
59
- width: 690px;
60
- height: 380px;
61
- position: relative;
62
- }
63
- #coloring {
64
- top: 0px;
65
- left: 0px;
66
- position: absolute;
67
- z-index: 1;
68
- }
69
- /* 上に重ねる画像 */
70
- #overImage {
71
- top: 0px;
72
- left: 0px;
73
- position: absolute;
74
- z-index: 2;
75
- }
76
-
77
- /* カラーパレットのCSS */
78
- #palette {
79
- margin: 0px 50px;
80
- padding: 0px;
81
- width: 690px;
82
- }
83
-
84
- /* 色ボタンのCSS */
85
- .Color {
86
- margin: 5px;
87
- padding: 0px;
88
- width: 30px;
89
- height: 30px;
90
- border: solid 1px #CCCCCC;
91
- }
92
-
93
- /* ペンサイズ */
94
- #penWidth {
95
- margin: 50px;
96
- padding: 0px;
97
- float: left;
98
- }
99
-
100
- #penWidth button {
101
- border: none;
102
- background-color: #FFFFFF;
103
- width: 30px;
104
- height: 30px;
105
- padding: 0px;
106
- }
107
- .penSize {
108
- border-radius: 50%;
109
- background-color: #000000;
110
- border: solid 1px #CCCCCC;
111
- margin: auto;
112
- }
113
-
114
- #penSizeL {
115
- width: 20px;
116
- height: 20px;
117
- }
118
-
119
- #penSizeM {
120
- width: 10px;
121
- height: 10px;
122
- }
123
-
124
- #penSizeS {
125
- width: 5px;
126
- height: 5px;
127
- }
128
-
129
- /* ペン濃度 */
130
- #penAlpha {
131
- margin: 50px;
132
- padding: 0px;
133
- float: left;
134
- }
135
-
136
- #hiddenLink{
137
- display: none;
138
- }
139
-
140
-
141
-
142
- </style>
143
- </head>
144
- <body>
145
- <!-- タイトルを表示する -->
146
- <h1>ぬり絵テスト</h1>
147
- <!-- キャンバスを置く -->
148
- <div id="canvas">
149
- <canvas id="overImage" width="690" height="380"></canvas>
150
- <canvas id="coloring" width="690" height="380"></canvas>
151
- </div>
152
- <!-- カラーパレット -->
153
- <div id="palette">カラーパレット<br />
154
- </div>
155
- <blockquote id="penWidth">ペン先<br />
156
- <button type="button" onClick="setPenSize('20')"><div class="penSize" id="penSizeL"></div></button>
157
- <button type="button" onClick="setPenSize('10')"><div class="penSize" id="penSizeM"></div></button>
158
- <button type="button" onClick="setPenSize('3' )"><div class="penSize" id="penSizeS"></div></button>
159
- </blockquote>
160
- <canvas id="coloring"></canvas>
161
- <div>
162
- <button onclick="downloadCanvas()">ダウンロード</button>
163
-
164
- <a id="hiddenLink" download="canvas.png">link</a>
165
- <!-- CSSで「display: none;」して非表示 -->
166
- <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
167
- <img id="canvasImage" src="dummy.png">
168
- <!-- CSSで小さめサイズに調整 -->
169
- </div>
170
-
171
- </body>
172
- <script type="text/javascript">
173
- // キャンバスを取得
174
- var canvas = document.getElementById("canvas");
175
- // 色塗り用
176
- var coloring = document.getElementById('coloring');
177
- // コンテキストを取得
178
- var ctx = coloring.getContext('2d');
179
-
180
- // カラーパレット取得
181
- var palette = document.getElementById('palette');
182
- // ペンサイズ
183
- var penSizeButtons = document.getElementsByClassName('penSize');
184
-
185
- // マウス位置
186
- var mouse = {x:0, y:0, bx:0, by:0};
187
- // クリック中フラグ
188
- var isClicked = false;
189
- // ペン色
190
- var penColor = "#000000";
191
- // ペン幅
192
- var penWidth = 10;
193
- // ペン濃度
194
- var penAlpha = 1.0;
195
-
196
- // 画像をキャンバスの上に描画する
197
- setImage()
198
-
199
- // 塗り絵の元を表示
200
- function setImage() {
201
- var overCanvas = document.getElementById('overImage');
202
- var overCtx = overCanvas.getContext('2d');
203
-
204
- /* Imageオブジェクトを生成 */
205
- var img = new Image();
206
- img.src="/div/shisetsu1/img/nanjamonja.png";
1
+ aaqfワエdrfty樹kdんtmキィmhtんgbfvd差cbgr縫いうyhんdsvbgんm,。・お;lkjhgfdsvzxdvfbnytukiloiujmdsvacabgnmyil,yu
207
-
208
- img.onload = function() {
209
- overCtx.drawImage(img, 0, 0)
210
- }
211
- console.log("setImage")
212
- }
213
-
214
-
215
- // 実行
216
- setColorPalette()
217
-
218
- var suportTouch = 'ontouchend' in document;
219
- var startEvent = suportTouch ? "touchstart" : "mousedown";
220
- var moveEvent = suportTouch ? "touchmove" : "mousemove";
221
- var endEvent = suportTouch ? "touchend" : "mouseup";
222
-
223
- // マウスイベントを取得
224
- // マウスクリック
225
- canvas.addEventListener(startEvent, function(e){
226
- if (suportTouch) {
227
- event.preventDefault(); // タッチによる画面スクロールを止める
228
- }
229
-
230
- startDraw(e);
231
- });
232
-
233
- // マウス移動
234
- canvas.addEventListener(moveEvent, function(e){
235
- drawing(e);
236
- });
237
-
238
- // マウスクリック解除
239
- canvas.addEventListener(endEvent, function(e){
240
- endDraw(e)
241
- });
242
-
243
- // ポジション閑散
244
- function getPosition(e) {
245
- // キャンバスの位置とサイズを取得
246
- var rect = e.target.getBoundingClientRect();
247
-
248
- if (suportTouch) {
249
- // マウスの位置
250
- mouse.x = e.touches[0].clientX - rect.left;
251
- mouse.y = e.touches[0].clientY - rect.top;
252
-
253
- } else {
254
- // マウスの位置
255
- mouse.x = e.clientX - rect.left;
256
- mouse.y = e.clientY - rect.top;
257
- }
258
- }
259
- // 線引き開始
260
- function startDraw(e) {
261
- // キャンバスの位置とサイズを取得
262
- getPosition(e);
263
-
264
- // 描画の開始
265
- drarLineStart();
266
-
267
- // クリック中フラグ
268
- isClicked = true;
269
- };
270
-
271
- // 線引き続行
272
- function drawing(e) {
273
- // クリック中以外の時は無視
274
- if(!isClicked) {
275
- return;
276
- }
277
-
278
- // 一つ前の位置
279
- mouse.bx = mouse.x;
280
- mouse.by = mouse.y;
281
-
282
- // キャンバスの位置とサイズを取得
283
- getPosition(e);
284
-
285
- // クリック中なら線を引く
286
- drawLine();
287
- };
288
-
289
- // 線引き完了
290
- function endDraw(e) {
291
- // クリック終了
292
- isClicked = false;
293
- };
294
-
295
- // 開始位置を指定
296
- function drarLineStart() {
297
- // 線の太さを指定
298
- ctx.lineWidth = penWidth;
299
- // 線の色を指定
300
- ctx.strokeStyle = penColor;
301
- ctx.globalAlpha = penAlpha;
302
- // 先端を丸くする
303
- ctx.lineCap = "round"
304
- // つなぎ目を丸くする
305
- ctx.lineJoint = "round"
306
- }
307
-
308
- // 線を引く
309
- function drawLine() {
310
- // 今からパスを書きますよと云う宣言
311
- ctx.beginPath();
312
- // パスの開始点に移動
313
- ctx.moveTo(mouse.bx, mouse.by);
314
- // 指定の位置までパスを引く
315
- ctx.lineTo(mouse.x, mouse.y);
316
- // パスに線を載せる
317
- ctx.stroke();
318
- }
319
-
320
- // カラーパレットを配置する
321
- function setColorPalette() {
322
- var colors = ['#FFFFFF', '#000000', '#B45F04', '#FE2E2E', '#FE642E', '#FE9A2E', '#FACC2E',
323
- '#F7FE2E', '#C8FE2E', '#64FE2E', '#2EFEC8', '#2ECCFA', '#2E9AFE',
324
- '#642EFE', '#9A2EFE', '#CC2EFA', '#FE2EC8',
325
- '#F5A9A9', '#F5BCA9', '#F5D0A9', '#F3E2A9', '#E1F5A9', '#A9F5A9', '#A9F5A9', '#A9F5E1',
326
- '#A9E2F3', '#A9D0F5', '#A9BCF5', '#A9A9F5', '#BCA9F5', '#D0A9F5',
327
- '#F5A9F2', '#F5A9D0', '#F5A9BC'];
328
-
329
- for(var i = 0; i < 34; i++) {
330
- var btn = "<button class='Color' style='background-color: " + colors[i] + ";' onClick='setPenColor(\"" + colors[i] + "\");'></button>"
331
- palette.innerHTML += btn;
332
- }
333
- }
334
-
335
- // 色を変更する
336
- function setPenColor(setColor) {
337
- penColor = setColor;
338
-
339
- // ペンの色を変える
340
- for(var i = 0; i < penSizeButtons.length; i++) {
341
- penSizeButtons[i].style.backgroundColor = setColor;
342
- }
343
- }
344
-
345
- // 線幅を変更する
346
- function setPenSize(size) {
347
- penWidth = size;
348
- }
349
-
350
- // 線の濃さを変更する
351
- function setPenAlpha(alpha) {
352
- penAlpha = alpha;
353
- }
354
- </script>
355
- </html>
356
- ```