๊ด€๋ฆฌ ๋ฉ”๋‰ด

Coding Archive

canvas js๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ (7) - saving canvas painting [์บ”๋ฒ„์Šค ๊ทธ๋ฆผ ์ €์žฅํ•˜๊ธฐ] ๋ณธ๋ฌธ

๐Ÿ’ป Programming/Java Script

canvas js๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ (7) - saving canvas painting [์บ”๋ฒ„์Šค ๊ทธ๋ฆผ ์ €์žฅํ•˜๊ธฐ]

์ฝ”๋“ฑ์–ด 2022. 10. 7. 11:35

saving canvas painting

 

 

 

์บ”๋ฒ„์Šค์— ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

[  html / css  ]

 

1
2
3
4
<body>
   <canvas id="canvas" width="700" height="700"></canvas>
   <button class="saveBtn">save image</button>
</body>
cs

 

html์—์„œ ์บ”๋ฒ„์Šค์™€ ์„ธ์ด๋ธŒ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
body {
  padding: 44px;
  display: flex;
  flex-direction: column;
  align-items: center;
  background-color: #f7f7f7;
}
 
canvas {
  background-color: white;
  border-radius: 5%;
  box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
  margin-bottom: 40px;
}
 
button {
  background-color: rgba(0, 0, 0, 0.4);
  border: none;
  border-radius: 25px;
  color: #f7f7f7;
  height: 50px;
  width: 125px;
  font-size: 15px;
  box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
  cursor: pointer;
  transition: all ease-in-out 0.15s;
}
 
button:hover {
  background-color: #606060;
  scale: 1.1;
}
cs

 

css๋กœ ์บ”๋ฒ„์Šค์™€ ๋ฒ„ํŠผ์˜ ์Šคํƒ€์ผ์„ ๊พธ๋ฉฐ์ค๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

[  js ]

 

1
2
3
const canvas = document.querySelector("#canvas");
const saveBtn = document.querySelector(".saveBtn");
const ctx = canvas.getContext("2d");
cs

 

๋จผ์ € ์บ”๋ฒ„์Šค์™€ ์„ธ์ด๋ธŒ ๋ฒ„ํŠผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ๊ณ , 2d ๋ชจ๋“œ์˜ ๊ทธ๋ฆฌ๊ธฐ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 


 

1
2
3
4
5
const canvas = document.querySelector("#canvas");
const saveBtn = document.querySelector(".saveBtn");
const ctx = canvas.getContext("2d");
 
saveBtn.addEventListener("click", onSaveClick);
cs

 

์„ธ์ด๋ธŒ ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค onSaveClickํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 


 

1
2
3
4
5
6
7
8
9
10
11
12
const canvas = document.querySelector("#canvas");
const saveBtn = document.querySelector(".saveBtn");
const ctx = canvas.getContext("2d");
 
saveBtn.addEventListener("click", onSaveClick);
 
function onSaveClick() {
   const a = document.createElement("a");
   a.href = canvas.toDataURL();
   a.download = "drawing.png";
   a.click();
}
cs

 

onSaveClickํ•จ์ˆ˜๋Š” ๊ทธ๋ฆผ์„ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜๋กœ, a ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ , ์†์„ฑ์„ ์ง€์ •ํ•œ ํ›„ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

์บ”๋ฒ„์Šค์—๋Š” canvas.toDataURL์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ,

๊ทธ๋ ค์ง„ ๋‚ด์šฉ์„ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ ค์ง„ ๋‚ด์šฉ์„ Data URL๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ)

a ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋งํฌ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , ์›น์‚ฌ์ดํŠธ๋กœ ๋งํฌํ•˜๋Š” ๋Œ€์‹  ์ด ์ด๋ฏธ์ง€ url๋กœ ๋งํฌํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋‹ค์Œ์— a ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” download๋ผ๋Š” ์†์„ฑ์„ ๋”ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  a ํƒœ๊ทธ ๊ฐ•์ œ๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ์ผœ ๋‹ค์šด ๋กœ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 


 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const canvas = document.querySelector("#canvas");
const saveBtn = document.querySelector(".saveBtn");
const ctx = canvas.getContext("2d");
 
function onSaveClick() {
  if (confirm("Are you sure you want to save this image?")) {
    const a = document.createElement("a");
    a.href = canvas.toDataURL();
    a.download = "drawing.png";
    a.click();
  }
}

saveBtn.addEventListener("click", onSaveClick);
cs

 

confirm() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ™•์ธ๊ณผ ์ทจ์†Œ ๋ฒ„ํŠผ์„ ๊ฐ€์ง„ ๋ฉ”์„ธ์ง€ ์ฐฝ์„ ๋„์šด ํ›„,

if ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด ํ™•์ธ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ์—๋งŒ ์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const canvas = document.querySelector("#canvas");
const saveBtn = document.querySelector(".saveBtn");
const ctx = canvas.getContext("2d");
 
// ์บ”๋ฒ„์Šค ๋Œ€์ง€ ์Šคํƒ€์ผ๊ณผ ์„  ์Šคํƒ€์ผ ์„ค์ •ํ•˜๊ธฐ
ctx.fillStyle = "white";
ctx.fillRect(00700700);
ctx.lineWidth = 5;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.strokeStyle = "coral";
 
// ์„ ๊ทธ๋ฆฌ๊ธฐ
let painting = false;
 
function onMouseMove(event) {
  if (!painting) {
    ctx.beginPath();
    ctx.moveTo(event.offsetX, event.offsetY);
  } else {
    ctx.lineTo(event.offsetX, event.offsetY);
    ctx.stroke();
  }
}
 
function startPainting() {
  painting = true;
}
 
function stopPainting() {
  painting = false;
}
 
canvas.addEventListener("mousemove", onMouseMove);
canvas.addEventListener("mousedown", startPainting);
canvas.addEventListener("mouseup", stopPainting);
canvas.addEventListener("mouseleave", stopPainting);
 
 
// ์บ”๋ฒ„์Šค ์ด๋ฏธ์ง€ ์ €์žฅํ•˜๊ธฐ
function onSaveClick() {
  if (confirm("Are you sure you want to save this image?")) {
    const a = document.createElement("a");
    a.href = canvas.toDataURL();
    a.download = "drawing.png";
    a.click();
  }
}
 
saveBtn.addEventListener("click", onSaveClick);
cs

 

์ „์— ๋งŒ๋“ค์—ˆ๋˜ ์„  ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

 

 

 

์บ”๋ฒ„์Šค์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฐ ํ›„ ์„ธ์ด๋ธŒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฌด์‚ฌํžˆ ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Comments