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

Coding Archive

canvas js๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ (6) - canvas drawing image[์บ”๋ฒ„์Šค์— ์ด๋ฏธ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ - ์‚ฌ์ง„์ฒจ๋ถ€] ๋ณธ๋ฌธ

๐Ÿ’ป Programming/Java Script

canvas js๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ (6) - canvas drawing image[์บ”๋ฒ„์Šค์— ์ด๋ฏธ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ - ์‚ฌ์ง„์ฒจ๋ถ€]

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

canvas drawing image

 

 

 

์บ”๋ฒ„์Šค์— ์‚ฌ์ง„์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

[  html / css  ]

 

1
2
3
4
<body>
    <canvas id="canvas" width="700" height="700"></canvas>
    <input type="file" accept="image/*" id="file" />
</body>
cs

 

accept ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด ์ฒจ๋ถ€ํ•˜๋ ค๋Š” file์„ ํŠน์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (accept="image/*" ->๋ชจ๋“  ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ)

 

 

 

์ด๋ ‡๊ฒŒ input file์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ์œ„์˜ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ฒ˜๋Ÿผ ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ css๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋ผ๋ฉด label์„ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

1
2
3
4
5
6
7
<body>
    <canvas id="canvas" width="700" height="700"></canvas>
    <label for="file">
      Add Photo
      <input type="file" accept="image/*" id="file" />
    </label>
</body>
cs

 

๋ผ๋ฒจ ํƒœ๊ทธ์˜ for ์†์„ฑ์„ ์ด์šฉํ•ด input file ํƒœ๊ทธ์™€ ์—ฐ๊ฒฐ์„ ์‹œ์ผœ์ฃผ๋ฉด, label์„ ํด๋ฆญํ–ˆ์„ ๋•Œ input file์„ ํด๋ฆญํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

* ์ด๋•Œ<input type="file" accept="image/* "id="file" />์€ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ label ํƒœ๊ทธ ์•ˆ์— ๋„ฃ์„ ์ˆ˜๋„, ๋ฐ–์— ๋นผ์„œ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ดํ›„์— css๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 

 

 


 

 

 

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
body {
  padding: 50px;
  display: flex;
  flex-direction: column;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.03);
}
 
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: 30px;
}
 
input {
  display: none;
}
 
label {
  font-family: "Source Sans Pro";
  width: 100px;
  padding: 8px 18px;
  border: 1.5px #ff6600 solid;
  background-color: #ff6600;
  border-radius: 5px;
  color: white;
  cursor: pointer;
  font-size: 14px;
  text-align: center;
  transition: all 0.2s ease-in-out;
}
 
label:hover {
  border: 1.8px #ff6600 solid;
  background-color: transparent;
  color: #ff6600;
}
cs

 

input file์— display: none;์„ ํ•ด์ฃผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ˆ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ์ ์šฉ์‹œํ‚จ label๋งŒ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

[  js  ]

 

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

 

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

 

 


 

 

1
2
3
4
5
6
const canvas = document.querySelector("#canvas");
const imgFile = document.querySelector("#file");
const ctx = canvas.getContext("2d");
 
imgFile.addEventListener("change", drawImg);
// = imgFile.onchange = drawImg;
cs

 

input file์— change ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค drawImg ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

* ์ด๋ฒคํŠธ ํƒ€์ž… ์ค‘ change๋Š” ํผ ์ปจํŠธ๋กค ๊ฐ’(value ๊ฐ’)์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, input(text, radio, checkbox), textarea, select ํƒœ๊ทธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 


 

 

๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์•„์ง ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์€ ์œ ์ €๊ฐ€ ํŒŒ์ผ์„ ์„ ํƒํ–ˆ์„ ๋•Œ๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋ณด์ด๊ฒŒ ๋˜๊ณ , ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ํŒŒ์ผ์€ ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ ์†์— ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ url์„ ๊ฐ€์ง€๊ณ  ๊ทธ ํŒŒ์ผ์— ์ ‘๊ทผํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const canvas = document.querySelector("#canvas");
const imgFile = document.querySelector("#file");
const ctx = canvas.getContext("2d");
 
function drawImg(event) {
  //1
  const file = event.target.files[0];
  //2  
  const url = URL.createObjectURL(file);
  //3
  const img = new Image();
  //4
  img.src = url;
  //5
  img.onload = function () {
    ctx.drawImage(img, 00700700);
  };
}
 
imgFile.addEventListener("change", drawImg);
cs

 

1.  ๋จผ์ € ์ฒจ๋ถ€๋˜๋Š” ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

2. ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ทธ ํŒŒ์ผ์˜ url์„ ์–ป์–ด์˜ต๋‹ˆ๋‹ค.

3. new Image()๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

const image = new Image()๋Š” html์—์„œ <img src=""/> ํƒœ๊ทธ๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

4. ์ด๋ฏธ์ง€์˜ src์— ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” url์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

5. ๊ทธ๋‹ค์Œ ์ด๋ฏธ์ง€์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ, ์ฆ‰ onload์ผ ๋•Œ, ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๊ฑด๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” drawImage()๋ผ๋Š” ctx method๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

* drawImage(image, x์ขŒํ‘œ, y์ขŒํ‘œ, ๋„ˆ๋น„, ๋†’์ด)

drawImage()๋Š” ์ด๋ฏธ์ง€์™€ ์œ„์น˜๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋น„์™€ ๋†’์ด๋Š” ์˜ต์…˜์œผ๋กœ ์ƒ๋žต ์‹œ์—๋Š” ์›๋ณธ ํฌ๊ธฐ๋Œ€๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

 

์บ”๋ฒ„์Šค์— ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ๋ฌด์‚ฌํžˆ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Comments