質問編集履歴

2

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

2020/07/21 06:19

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- あがcsばghにあ
1
+ Canvasの保存(塗り絵アプリで線画と描画のふたつのCanvasを合成したものを保存した
test CHANGED
@@ -1 +1,601 @@
1
+ ### 前提・実現したいこと
2
+
3
+ ブラウザ上で起動する塗り絵を作成しています。
4
+
5
+ 見様見真似ですが、htmlとjavascriptで、
6
+
7
+ 線画を表示するcanvasの下に描画用のcanvasを置いています。
8
+
9
+ 最終的には、作成者がその完成画像をダウンロードできるようにすることです。
10
+
11
+ ### 発生している問題・エラーメッセージ
12
+
13
+ 画像を保存させる方法がわかりません。
14
+
15
+ 調べて、以下のコードを入れ込みました。
16
+
17
+ html↓
18
+
19
+ ```
20
+
21
+ <button onclick="downloadCanvas()">ダウンロード</button>
22
+
23
+ <a id="hiddenLink" download="canvas.png">link</a>
24
+
25
+ <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
26
+
27
+ <img id="canvasImage" src="dummy.png">
28
+
29
+ ```
30
+
31
+ script↓
32
+
33
+ ```
34
+
35
+ function downloadCanvas() {
36
+
37
+ let canvas = document.getElementById('canvas')
38
+
39
+ let link = document.getElementById('hiddenLink')
40
+
41
+ link.href = canvas.toDataURL()
42
+
43
+ document.getElementById('canvasImage').src = canvas.toDataURL()
44
+
45
+ link.click()
46
+
47
+ ```
48
+
49
+ しかし、線画用のcanvasと描画用のcanvasが別々なので、
50
+
51
+ それを合成した完成形をダウンロードさせることができません。
52
+
53
+ IdのところをいずれかのIdにすれば、どちらかをダウンロードさせることはできます。
54
+
55
+ 合成した第3のcanvasを作る必要があるのかと思うのですが、やり方がわかりません。
56
+
57
+ なにかお分かりになる方お教えいただけば幸いです。
58
+
59
+ よろしくお願いいたします。
60
+
61
+ ### ソースコード全体
62
+
63
+ ```ここに言語名を入力
64
+
65
+ <!DOCTYPE html>
66
+
67
+ <html>
68
+
69
+ <head>
70
+
71
+ <meta charset="utf-8">
72
+
73
+ <title>ぬり絵テスト</title>
74
+
75
+ <style type="text/css">
76
+
77
+ /* h1のCSS */
78
+
79
+ h1 {
80
+
81
+ margin-left: 50px;
82
+
83
+ color: #cccccc;
84
+
85
+ }
86
+
87
+ /* キャンバスのCSS */
88
+
89
+ #canvas {
90
+
91
+ border: solid 1px #cccccc;
92
+
93
+ margin: 0px 50px;
94
+
95
+ width: 690px;
96
+
97
+ height: 380px;
98
+
99
+ position: relative;
100
+
101
+ }
102
+
103
+ #coloring {
104
+
105
+ top: 0px;
106
+
107
+ left: 0px;
108
+
109
+ position: absolute;
110
+
111
+ z-index: 1;
112
+
113
+ }
114
+
115
+ /* 上に重ねる画像 */
116
+
117
+ #overImage {
118
+
119
+ top: 0px;
120
+
121
+ left: 0px;
122
+
123
+ position: absolute;
124
+
125
+ z-index: 2;
126
+
127
+ }
128
+
129
+ /* カラーパレットのCSS */
130
+
131
+ #palette {
132
+
133
+ margin: 0px 50px;
134
+
135
+ padding: 0px;
136
+
137
+ width: 690px;
138
+
139
+ }
140
+
141
+ /* 色ボタンのCSS */
142
+
143
+ .Color {
144
+
145
+ margin: 5px;
146
+
147
+ padding: 0px;
148
+
149
+ width: 30px;
150
+
151
+ height: 30px;
152
+
153
+ border: solid 1px #CCCCCC;
154
+
155
+ }
156
+
157
+ /* ペンサイズ */
158
+
159
+ #penWidth {
160
+
161
+ margin: 50px;
162
+
163
+ padding: 0px;
164
+
165
+ float: left;
166
+
167
+ }
168
+
169
+ #penWidth button {
170
+
171
+ border: none;
172
+
173
+ background-color: #FFFFFF;
174
+
175
+ width: 30px;
176
+
177
+ height: 30px;
178
+
179
+ padding: 0px;
180
+
181
+ }
182
+
183
+ .penSize {
184
+
185
+ border-radius: 50%;
186
+
187
+ background-color: #000000;
188
+
189
+ border: solid 1px #CCCCCC;
190
+
191
+ margin: auto;
192
+
193
+ }
194
+
195
+ #penSizeL {
196
+
197
+ width: 20px;
198
+
199
+ height: 20px;
200
+
201
+ }
202
+
203
+ #penSizeM {
204
+
205
+ width: 10px;
206
+
207
+ height: 10px;
208
+
209
+ }
210
+
211
+ #penSizeS {
212
+
213
+ width: 5px;
214
+
215
+ height: 5px;
216
+
217
+ }
218
+
219
+ /* ペン濃度 */
220
+
221
+ #penAlpha {
222
+
223
+ margin: 50px;
224
+
225
+ padding: 0px;
226
+
227
+ float: left;
228
+
229
+ }
230
+
231
+ #hiddenLink{
232
+
233
+ display: none;
234
+
235
+ }
236
+
237
+ </style>
238
+
239
+ </head>
240
+
241
+ <body>
242
+
243
+ <!-- タイトルを表示する -->
244
+
245
+ <h1>ぬり絵テスト</h1>
246
+
247
+ <!-- キャンバスを置く -->
248
+
249
+ <div id="canvas">
250
+
251
+ <canvas id="overImage" width="690" height="380"></canvas>
252
+
253
+ <canvas id="coloring" width="690" height="380"></canvas>
254
+
255
+ </div>
256
+
257
+ <!-- カラーパレット -->
258
+
259
+ <div id="palette">カラーパレット<br />
260
+
261
+ </div>
262
+
263
+ <blockquote id="penWidth">ペン先<br />
264
+
265
+ <button type="button" onClick="setPenSize('20')"><div class="penSize" id="penSizeL"></div></button>
266
+
267
+ <button type="button" onClick="setPenSize('10')"><div class="penSize" id="penSizeM"></div></button>
268
+
269
+ <button type="button" onClick="setPenSize('3' )"><div class="penSize" id="penSizeS"></div></button>
270
+
271
+ </blockquote>
272
+
273
+ <canvas id="coloring"></canvas>
274
+
275
+ <div>
276
+
277
+ <button onclick="downloadCanvas()">ダウンロード</button>
278
+
279
+
280
+
281
+ <a id="hiddenLink" download="canvas.png">link</a>
282
+
283
+ <!-- CSSで「display: none;」して非表示 -->
284
+
285
+ <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
286
+
287
+ <img id="canvasImage" src="dummy.png">
288
+
289
+ <!-- CSSで小さめサイズに調整 -->
290
+
291
+ </div>
292
+
293
+ </body>
294
+
295
+ <script type="text/javascript">
296
+
297
+ // キャンバスを取得
298
+
299
+ var canvas = document.getElementById("canvas");
300
+
301
+ // 色塗り用
302
+
303
+ var coloring = document.getElementById('coloring');
304
+
305
+ // コンテキストを取得
306
+
307
+ var ctx = coloring.getContext('2d');
308
+
309
+ // カラーパレット取得
310
+
311
+ var palette = document.getElementById('palette');
312
+
313
+ // ペンサイズ
314
+
315
+ var penSizeButtons = document.getElementsByClassName('penSize');
316
+
317
+ // マウス位置
318
+
319
+ var mouse = {x:0, y:0, bx:0, by:0};
320
+
321
+ // クリック中フラグ
322
+
323
+ var isClicked = false;
324
+
325
+ // ペン色
326
+
327
+ var penColor = "#000000";
328
+
329
+ // ペン幅
330
+
331
+ var penWidth = 10;
332
+
333
+ // ペン濃度
334
+
335
+ var penAlpha = 1.0;
336
+
337
+ // 画像をキャンバスの上に描画する
338
+
339
+ setImage()
340
+
341
+ // 塗り絵の元を表示
342
+
343
+ function setImage() {
344
+
345
+ var overCanvas = document.getElementById('overImage');
346
+
347
+ var overCtx = overCanvas.getContext('2d');
348
+
349
+ /* Imageオブジェクトを生成 */
350
+
351
+ var img = new Image();
352
+
1
- aaqfワエdrfty樹kdんtmキィmhtんgbfvd差cbgr縫いうyhんdsvbgんm,。・お;lkjhgfdsvzxdvfbnytukiloiujmdsvacabgnmyil,yu
353
+ img.src="/div/shisetsu1/img/nanjamonja.png";
354
+
355
+ img.onload = function() {
356
+
357
+ overCtx.drawImage(img, 0, 0)
358
+
359
+ }
360
+
361
+ console.log("setImage")
362
+
363
+ }
364
+
365
+ // 実行
366
+
367
+ setColorPalette()
368
+
369
+ var suportTouch = 'ontouchend' in document;
370
+
371
+ var startEvent = suportTouch ? "touchstart" : "mousedown";
372
+
373
+ var moveEvent = suportTouch ? "touchmove" : "mousemove";
374
+
375
+ var endEvent = suportTouch ? "touchend" : "mouseup";
376
+
377
+ // マウスイベントを取得
378
+
379
+ // マウスクリック
380
+
381
+ canvas.addEventListener(startEvent, function(e){
382
+
383
+ if (suportTouch) {
384
+
385
+ event.preventDefault(); // タッチによる画面スクロールを止める
386
+
387
+ }
388
+
389
+ startDraw(e);
390
+
391
+ });
392
+
393
+ // マウス移動
394
+
395
+ canvas.addEventListener(moveEvent, function(e){
396
+
397
+ drawing(e);
398
+
399
+ });
400
+
401
+ // マウスクリック解除
402
+
403
+ canvas.addEventListener(endEvent, function(e){
404
+
405
+ endDraw(e)
406
+
407
+ });
408
+
409
+ // ポジション閑散
410
+
411
+ function getPosition(e) {
412
+
413
+ // キャンバスの位置とサイズを取得
414
+
415
+ var rect = e.target.getBoundingClientRect();
416
+
417
+ if (suportTouch) {
418
+
419
+ // マウスの位置
420
+
421
+ mouse.x = e.touches[0].clientX - rect.left;
422
+
423
+ mouse.y = e.touches[0].clientY - rect.top;
424
+
425
+ } else {
426
+
427
+ // マウスの位置
428
+
429
+ mouse.x = e.clientX - rect.left;
430
+
431
+ mouse.y = e.clientY - rect.top;
432
+
433
+ }
434
+
435
+ }
436
+
437
+ // 線引き開始
438
+
439
+ function startDraw(e) {
440
+
441
+ // キャンバスの位置とサイズを取得
442
+
443
+ getPosition(e);
444
+
445
+ // 描画の開始
446
+
447
+ drarLineStart();
448
+
449
+ // クリック中フラグ
450
+
451
+ isClicked = true;
452
+
453
+ };
454
+
455
+ // 線引き続行
456
+
457
+ function drawing(e) {
458
+
459
+ // クリック中以外の時は無視
460
+
461
+ if(!isClicked) {
462
+
463
+ return;
464
+
465
+ }
466
+
467
+ // 一つ前の位置
468
+
469
+ mouse.bx = mouse.x;
470
+
471
+ mouse.by = mouse.y;
472
+
473
+ // キャンバスの位置とサイズを取得
474
+
475
+ getPosition(e);
476
+
477
+ // クリック中なら線を引く
478
+
479
+ drawLine();
480
+
481
+ };
482
+
483
+ // 線引き完了
484
+
485
+ function endDraw(e) {
486
+
487
+ // クリック終了
488
+
489
+ isClicked = false;
490
+
491
+ };
492
+
493
+ // 開始位置を指定
494
+
495
+ function drarLineStart() {
496
+
497
+ // 線の太さを指定
498
+
499
+ ctx.lineWidth = penWidth;
500
+
501
+ // 線の色を指定
502
+
503
+ ctx.strokeStyle = penColor;
504
+
505
+ ctx.globalAlpha = penAlpha;
506
+
507
+ // 先端を丸くする
508
+
509
+ ctx.lineCap = "round"
510
+
511
+ // つなぎ目を丸くする
512
+
513
+ ctx.lineJoint = "round"
514
+
515
+ }
516
+
517
+ // 線を引く
518
+
519
+ function drawLine() {
520
+
521
+ // 今からパスを書きますよと云う宣言
522
+
523
+ ctx.beginPath();
524
+
525
+ // パスの開始点に移動
526
+
527
+ ctx.moveTo(mouse.bx, mouse.by);
528
+
529
+ // 指定の位置までパスを引く
530
+
531
+ ctx.lineTo(mouse.x, mouse.y);
532
+
533
+ // パスに線を載せる
534
+
535
+ ctx.stroke();
536
+
537
+ }
538
+
539
+ // カラーパレットを配置する
540
+
541
+ function setColorPalette() {
542
+
543
+ var colors = ['#FFFFFF', '#000000', '#B45F04', '#FE2E2E', '#FE642E', '#FE9A2E', '#FACC2E',
544
+
545
+ '#F7FE2E', '#C8FE2E', '#64FE2E', '#2EFEC8', '#2ECCFA', '#2E9AFE',
546
+
547
+ '#642EFE', '#9A2EFE', '#CC2EFA', '#FE2EC8',
548
+
549
+ '#F5A9A9', '#F5BCA9', '#F5D0A9', '#F3E2A9', '#E1F5A9', '#A9F5A9', '#A9F5A9', '#A9F5E1',
550
+
551
+ '#A9E2F3', '#A9D0F5', '#A9BCF5', '#A9A9F5', '#BCA9F5', '#D0A9F5',
552
+
553
+ '#F5A9F2', '#F5A9D0', '#F5A9BC'];
554
+
555
+ for(var i = 0; i < 34; i++) {
556
+
557
+ var btn = "<button class='Color' style='background-color: " + colors[i] + ";' onClick='setPenColor(\"" + colors[i] + "\");'></button>"
558
+
559
+ palette.innerHTML += btn;
560
+
561
+ }
562
+
563
+ }
564
+
565
+ // 色を変更する
566
+
567
+ function setPenColor(setColor) {
568
+
569
+ penColor = setColor;
570
+
571
+ // ペンの色を変える
572
+
573
+ for(var i = 0; i < penSizeButtons.length; i++) {
574
+
575
+ penSizeButtons[i].style.backgroundColor = setColor;
576
+
577
+ }
578
+
579
+ }
580
+
581
+ // 線幅を変更する
582
+
583
+ function setPenSize(size) {
584
+
585
+ penWidth = size;
586
+
587
+ }
588
+
589
+ // 線の濃さを変更する
590
+
591
+ function setPenAlpha(alpha) {
592
+
593
+ penAlpha = alpha;
594
+
595
+ }
596
+
597
+ </script>
598
+
599
+ </html>
600
+
601
+ ```

1

htfgnybdsvwfed

2020/07/21 06:19

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- Canvasの保存(塗り絵アプリで線画と描画のふたつのCanvasを合成したものを保存した
1
+ あがcsばghにあ
test CHANGED
@@ -1,711 +1 @@
1
- ### 前提・実現したいこと
2
-
3
-
4
-
5
- ブラウザ上で起動する塗り絵を作成しています。
6
-
7
- 見様見真似ですが、htmlとjavascriptで、
8
-
9
- 線画を表示するcanvasの下に描画用のcanvasを置いています。
10
-
11
- 最終的には、作成者がその完成画像をダウンロードできるようにすることです。
12
-
13
-
14
-
15
- ### 発生している問題・エラーメッセージ
16
-
17
-
18
-
19
- 画像を保存させる方法がわかりません。
20
-
21
- 調べて、以下のコードを入れ込みました。
22
-
23
-
24
-
25
- html↓
26
-
27
- ```
28
-
29
- <button onclick="downloadCanvas()">ダウンロード</button>
30
-
31
- <a id="hiddenLink" download="canvas.png">link</a>
32
-
33
- <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
34
-
35
- <img id="canvasImage" src="dummy.png">
36
-
37
- ```
38
-
39
- script↓
40
-
41
- ```
42
-
43
- function downloadCanvas() {
44
-
45
- let canvas = document.getElementById('canvas')
46
-
47
- let link = document.getElementById('hiddenLink')
48
-
49
- link.href = canvas.toDataURL()
50
-
51
-
52
-
53
- document.getElementById('canvasImage').src = canvas.toDataURL()
54
-
55
-
56
-
57
- link.click()
58
-
59
- ```
60
-
61
-
62
-
63
- しかし、線画用のcanvasと描画用のcanvasが別々なので、
64
-
65
- それを合成した完成形をダウンロードさせることができません。
66
-
67
- IdのところをいずれかのIdにすれば、どちらかをダウンロードさせることはできます。
68
-
69
- 合成した第3のcanvasを作る必要があるのかと思うのですが、やり方がわかりません。
70
-
71
- なにかお分かりになる方お教えいただけば幸いです。
72
-
73
- よろしくお願いいたします。
74
-
75
-
76
-
77
- ### ソースコード全体
78
-
79
-
80
-
81
- ```ここに言語名を入力
82
-
83
-
84
-
85
- <!DOCTYPE html>
86
-
87
- <html>
88
-
89
- <head>
90
-
91
- <meta charset="utf-8">
92
-
93
- <title>ぬり絵テスト</title>
94
-
95
- <style type="text/css">
96
-
97
- /* h1のCSS */
98
-
99
- h1 {
100
-
101
- margin-left: 50px;
102
-
103
- color: #cccccc;
104
-
105
- }
106
-
107
-
108
-
109
- /* キャンバスのCSS */
110
-
111
- #canvas {
112
-
113
- border: solid 1px #cccccc;
114
-
115
- margin: 0px 50px;
116
-
117
- width: 690px;
118
-
119
- height: 380px;
120
-
121
- position: relative;
122
-
123
- }
124
-
125
- #coloring {
126
-
127
- top: 0px;
128
-
129
- left: 0px;
130
-
131
- position: absolute;
132
-
133
- z-index: 1;
134
-
135
- }
136
-
137
- /* 上に重ねる画像 */
138
-
139
- #overImage {
140
-
141
- top: 0px;
142
-
143
- left: 0px;
144
-
145
- position: absolute;
146
-
147
- z-index: 2;
148
-
149
- }
150
-
151
-
152
-
153
- /* カラーパレットのCSS */
154
-
155
- #palette {
156
-
157
- margin: 0px 50px;
158
-
159
- padding: 0px;
160
-
161
- width: 690px;
162
-
163
- }
164
-
165
-
166
-
167
- /* 色ボタンのCSS */
168
-
169
- .Color {
170
-
171
- margin: 5px;
172
-
173
- padding: 0px;
174
-
175
- width: 30px;
176
-
177
- height: 30px;
178
-
179
- border: solid 1px #CCCCCC;
180
-
181
- }
182
-
183
-
184
-
185
- /* ペンサイズ */
186
-
187
- #penWidth {
188
-
189
- margin: 50px;
190
-
191
- padding: 0px;
192
-
193
- float: left;
194
-
195
- }
196
-
197
-
198
-
199
- #penWidth button {
200
-
201
- border: none;
202
-
203
- background-color: #FFFFFF;
204
-
205
- width: 30px;
206
-
207
- height: 30px;
208
-
209
- padding: 0px;
210
-
211
- }
212
-
213
- .penSize {
214
-
215
- border-radius: 50%;
216
-
217
- background-color: #000000;
218
-
219
- border: solid 1px #CCCCCC;
220
-
221
- margin: auto;
222
-
223
- }
224
-
225
-
226
-
227
- #penSizeL {
228
-
229
- width: 20px;
230
-
231
- height: 20px;
232
-
233
- }
234
-
235
-
236
-
237
- #penSizeM {
238
-
239
- width: 10px;
240
-
241
- height: 10px;
242
-
243
- }
244
-
245
-
246
-
247
- #penSizeS {
248
-
249
- width: 5px;
250
-
251
- height: 5px;
252
-
253
- }
254
-
255
-
256
-
257
- /* ペン濃度 */
258
-
259
- #penAlpha {
260
-
261
- margin: 50px;
262
-
263
- padding: 0px;
264
-
265
- float: left;
266
-
267
- }
268
-
269
-
270
-
271
- #hiddenLink{
272
-
273
- display: none;
274
-
275
- }
276
-
277
-
278
-
279
-
280
-
281
-
282
-
283
- </style>
284
-
285
- </head>
286
-
287
- <body>
288
-
289
- <!-- タイトルを表示する -->
290
-
291
- <h1>ぬり絵テスト</h1>
292
-
293
- <!-- キャンバスを置く -->
294
-
295
- <div id="canvas">
296
-
297
- <canvas id="overImage" width="690" height="380"></canvas>
298
-
299
- <canvas id="coloring" width="690" height="380"></canvas>
300
-
301
- </div>
302
-
303
- <!-- カラーパレット -->
304
-
305
- <div id="palette">カラーパレット<br />
306
-
307
- </div>
308
-
309
- <blockquote id="penWidth">ペン先<br />
310
-
311
- <button type="button" onClick="setPenSize('20')"><div class="penSize" id="penSizeL"></div></button>
312
-
313
- <button type="button" onClick="setPenSize('10')"><div class="penSize" id="penSizeM"></div></button>
314
-
315
- <button type="button" onClick="setPenSize('3' )"><div class="penSize" id="penSizeS"></div></button>
316
-
317
- </blockquote>
318
-
319
- <canvas id="coloring"></canvas>
320
-
321
- <div>
322
-
323
- <button onclick="downloadCanvas()">ダウンロード</button>
324
-
325
-
326
-
327
- <a id="hiddenLink" download="canvas.png">link</a>
328
-
329
- <!-- CSSで「display: none;」して非表示 -->
330
-
331
- <p>ダウンロードできない場合、下図を右クリックして保存してください。</p>
332
-
333
- <img id="canvasImage" src="dummy.png">
334
-
335
- <!-- CSSで小さめサイズに調整 -->
336
-
337
- </div>
338
-
339
-
340
-
341
- </body>
342
-
343
- <script type="text/javascript">
344
-
345
- // キャンバスを取得
346
-
347
- var canvas = document.getElementById("canvas");
348
-
349
- // 色塗り用
350
-
351
- var coloring = document.getElementById('coloring');
352
-
353
- // コンテキストを取得
354
-
355
- var ctx = coloring.getContext('2d');
356
-
357
-
358
-
359
- // カラーパレット取得
360
-
361
- var palette = document.getElementById('palette');
362
-
363
- // ペンサイズ
364
-
365
- var penSizeButtons = document.getElementsByClassName('penSize');
366
-
367
-
368
-
369
- // マウス位置
370
-
371
- var mouse = {x:0, y:0, bx:0, by:0};
372
-
373
- // クリック中フラグ
374
-
375
- var isClicked = false;
376
-
377
- // ペン色
378
-
379
- var penColor = "#000000";
380
-
381
- // ペン幅
382
-
383
- var penWidth = 10;
384
-
385
- // ペン濃度
386
-
387
- var penAlpha = 1.0;
388
-
389
-
390
-
391
- // 画像をキャンバスの上に描画する
392
-
393
- setImage()
394
-
395
-
396
-
397
- // 塗り絵の元を表示
398
-
399
- function setImage() {
400
-
401
- var overCanvas = document.getElementById('overImage');
402
-
403
- var overCtx = overCanvas.getContext('2d');
404
-
405
-
406
-
407
- /* Imageオブジェクトを生成 */
408
-
409
- var img = new Image();
410
-
411
- img.src="/div/shisetsu1/img/nanjamonja.png";
1
+ aaqfワエdrfty樹kdんtmキィmhtんgbfvd差cbgr縫いうyhんdsvbgんm,。・お;lkjhgfdsvzxdvfbnytukiloiujmdsvacabgnmyil,yu
412
-
413
-
414
-
415
- img.onload = function() {
416
-
417
- overCtx.drawImage(img, 0, 0)
418
-
419
- }
420
-
421
- console.log("setImage")
422
-
423
- }
424
-
425
-
426
-
427
-
428
-
429
- // 実行
430
-
431
- setColorPalette()
432
-
433
-
434
-
435
- var suportTouch = 'ontouchend' in document;
436
-
437
- var startEvent = suportTouch ? "touchstart" : "mousedown";
438
-
439
- var moveEvent = suportTouch ? "touchmove" : "mousemove";
440
-
441
- var endEvent = suportTouch ? "touchend" : "mouseup";
442
-
443
-
444
-
445
- // マウスイベントを取得
446
-
447
- // マウスクリック
448
-
449
- canvas.addEventListener(startEvent, function(e){
450
-
451
- if (suportTouch) {
452
-
453
- event.preventDefault(); // タッチによる画面スクロールを止める
454
-
455
- }
456
-
457
-
458
-
459
- startDraw(e);
460
-
461
- });
462
-
463
-
464
-
465
- // マウス移動
466
-
467
- canvas.addEventListener(moveEvent, function(e){
468
-
469
- drawing(e);
470
-
471
- });
472
-
473
-
474
-
475
- // マウスクリック解除
476
-
477
- canvas.addEventListener(endEvent, function(e){
478
-
479
- endDraw(e)
480
-
481
- });
482
-
483
-
484
-
485
- // ポジション閑散
486
-
487
- function getPosition(e) {
488
-
489
- // キャンバスの位置とサイズを取得
490
-
491
- var rect = e.target.getBoundingClientRect();
492
-
493
-
494
-
495
- if (suportTouch) {
496
-
497
- // マウスの位置
498
-
499
- mouse.x = e.touches[0].clientX - rect.left;
500
-
501
- mouse.y = e.touches[0].clientY - rect.top;
502
-
503
-
504
-
505
- } else {
506
-
507
- // マウスの位置
508
-
509
- mouse.x = e.clientX - rect.left;
510
-
511
- mouse.y = e.clientY - rect.top;
512
-
513
- }
514
-
515
- }
516
-
517
- // 線引き開始
518
-
519
- function startDraw(e) {
520
-
521
- // キャンバスの位置とサイズを取得
522
-
523
- getPosition(e);
524
-
525
-
526
-
527
- // 描画の開始
528
-
529
- drarLineStart();
530
-
531
-
532
-
533
- // クリック中フラグ
534
-
535
- isClicked = true;
536
-
537
- };
538
-
539
-
540
-
541
- // 線引き続行
542
-
543
- function drawing(e) {
544
-
545
- // クリック中以外の時は無視
546
-
547
- if(!isClicked) {
548
-
549
- return;
550
-
551
- }
552
-
553
-
554
-
555
- // 一つ前の位置
556
-
557
- mouse.bx = mouse.x;
558
-
559
- mouse.by = mouse.y;
560
-
561
-
562
-
563
- // キャンバスの位置とサイズを取得
564
-
565
- getPosition(e);
566
-
567
-
568
-
569
- // クリック中なら線を引く
570
-
571
- drawLine();
572
-
573
- };
574
-
575
-
576
-
577
- // 線引き完了
578
-
579
- function endDraw(e) {
580
-
581
- // クリック終了
582
-
583
- isClicked = false;
584
-
585
- };
586
-
587
-
588
-
589
- // 開始位置を指定
590
-
591
- function drarLineStart() {
592
-
593
- // 線の太さを指定
594
-
595
- ctx.lineWidth = penWidth;
596
-
597
- // 線の色を指定
598
-
599
- ctx.strokeStyle = penColor;
600
-
601
- ctx.globalAlpha = penAlpha;
602
-
603
- // 先端を丸くする
604
-
605
- ctx.lineCap = "round"
606
-
607
- // つなぎ目を丸くする
608
-
609
- ctx.lineJoint = "round"
610
-
611
- }
612
-
613
-
614
-
615
- // 線を引く
616
-
617
- function drawLine() {
618
-
619
- // 今からパスを書きますよと云う宣言
620
-
621
- ctx.beginPath();
622
-
623
- // パスの開始点に移動
624
-
625
- ctx.moveTo(mouse.bx, mouse.by);
626
-
627
- // 指定の位置までパスを引く
628
-
629
- ctx.lineTo(mouse.x, mouse.y);
630
-
631
- // パスに線を載せる
632
-
633
- ctx.stroke();
634
-
635
- }
636
-
637
-
638
-
639
- // カラーパレットを配置する
640
-
641
- function setColorPalette() {
642
-
643
- var colors = ['#FFFFFF', '#000000', '#B45F04', '#FE2E2E', '#FE642E', '#FE9A2E', '#FACC2E',
644
-
645
- '#F7FE2E', '#C8FE2E', '#64FE2E', '#2EFEC8', '#2ECCFA', '#2E9AFE',
646
-
647
- '#642EFE', '#9A2EFE', '#CC2EFA', '#FE2EC8',
648
-
649
- '#F5A9A9', '#F5BCA9', '#F5D0A9', '#F3E2A9', '#E1F5A9', '#A9F5A9', '#A9F5A9', '#A9F5E1',
650
-
651
- '#A9E2F3', '#A9D0F5', '#A9BCF5', '#A9A9F5', '#BCA9F5', '#D0A9F5',
652
-
653
- '#F5A9F2', '#F5A9D0', '#F5A9BC'];
654
-
655
-
656
-
657
- for(var i = 0; i < 34; i++) {
658
-
659
- var btn = "<button class='Color' style='background-color: " + colors[i] + ";' onClick='setPenColor(\"" + colors[i] + "\");'></button>"
660
-
661
- palette.innerHTML += btn;
662
-
663
- }
664
-
665
- }
666
-
667
-
668
-
669
- // 色を変更する
670
-
671
- function setPenColor(setColor) {
672
-
673
- penColor = setColor;
674
-
675
-
676
-
677
- // ペンの色を変える
678
-
679
- for(var i = 0; i < penSizeButtons.length; i++) {
680
-
681
- penSizeButtons[i].style.backgroundColor = setColor;
682
-
683
- }
684
-
685
- }
686
-
687
-
688
-
689
- // 線幅を変更する
690
-
691
- function setPenSize(size) {
692
-
693
- penWidth = size;
694
-
695
- }
696
-
697
-
698
-
699
- // 線の濃さを変更する
700
-
701
- function setPenAlpha(alpha) {
702
-
703
- penAlpha = alpha;
704
-
705
- }
706
-
707
- </script>
708
-
709
- </html>
710
-
711
- ```