Skip to content

๐Ÿชต 4. Canvas ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค

D.Joung edited this page Dec 5, 2024 · 1 revision

Canvas API

  • canvas๋Š” ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ gpu ๊ฐ€์†์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•ˆ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, webGL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ GPU์—์„œ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • canvas๋Š” ๊ฐ„๋‹จํ•œ ์š”๊ตฌ์‚ฌํ•ญ ์„œ๋น„์Šค์˜ 2D ๊ทธ๋ž˜ํ”ฝ ๊ตฌํ˜„์— ์ ํ•ฉํ•˜๊ณ , webGL์€ ์ฃผ๋กœ ๊ณ ์„ฑ๋Šฅ 3D ๊ทธ๋ž˜ํ”ฝ๊ณผ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • WebGL์€ ์ƒํ˜ธ์ž‘์šฉ ์ด๋ฒคํŠธ(๋งˆ์šฐ์Šค ํด๋ฆญ ๋“ฑ)์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฐ˜๋ฉด canvas๋Š” ์ด๋Ÿฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€ ๋™์ž‘ ํ๋ฆ„
    1. PATH ์ •์˜ :
      • vector ํ˜•ํƒœ์˜ path ์ •๋ณด๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค. ํŠน์ • ์œ„์น˜์™€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฒกํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    2. ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น :
      • fill, stroke, fillRect, strokeRect ๋“ฑ์„ ํ˜ธ์ถœํ•˜๋ฉด canvas๋Š” ๊ฐ–๊ณ  ์žˆ๋˜ vector ์ •๋ณด๋ฅผ ๋น„ํŠธ๋งต ์ด๋ฏธ์ง€ ํ”ฝ์…€ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜๋˜์–ด, canvas์˜ ๋น„ํŠธ๋งต ๋ฒ„ํผ์— ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
    3. ๊ทธ๋ฆฌ๊ธฐ ์ดํ›„ :
      • ์ด ์‹œ์ ๋ถ€ํ„ฐ ์ด๋ฏธ์ง€๋Š” ๋น„ํŠธ๋งต ๋ฐ์ดํ„ฐ๋กœ ๋‹ค๋ฃจ์–ด์ง„๋‹ค. ํ™•๋Œ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•  ๊ฒฝ์šฐ ๋น„ํŠธ๋งต ์ด๋ฏธ์ง€๋กœ์„œ ์กฐ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜์‘ํ˜•์ผ ๊ฒฝ์šฐ ์บ”๋ฒ„์Šค ํฌ๊ธฐ ์กฐ์ •
    • ์บ”๋ฒ„์Šค์˜ ๋ทฐํฌํŠธ ํฌ๊ธฐ๋Š” canvas ์—˜๋ฆฌ๋จผํŠธ์˜ width, height ์†์„ฑ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
    • css๋กœ ์บ”๋ฒ„์Šค ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค๋„ ํ•ด์ƒ๋„๋Š” ๊ทธ๋Œ€๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ขŒํ‘œ๊ณ„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ canvas๋ฅผ ์žฌ๋žœ๋”๋ง ํ•ด์ฃผ๋˜๊ฐ€, ์•„๋‹ˆ๋ฉด ์ขŒํ‘œ๊ณ„๋„ ํ•จ๊ป˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Canvas API ๊ธฐ๋ณธ ์˜ˆ์ œ

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

ctx.fillStyle = "green";
ctx.fillRect(10, 10, 150, 100);
  • document.getElementById๋Š” ์—˜๋ฆฌ๋จผํŠธ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์–ป์–ด์˜ต๋‹ˆ๋‹ค.
  • canvas.getContext()๋Š” ์—˜๋ฆฌ๋จผํŠธ์˜ ์ปจํ…์ŠคํŠธ(๋ Œ๋”๋ง ๋  ๊ทธ๋ฆฌ๊ธฐ ๋Œ€์ƒ)๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
    • โ€˜2dโ€™ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด โ€˜CanvasRenderingContext2Dโ€™ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ป๊ฒŒ ๋˜๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 2d ๊ทธ๋ฆฌ๊ธฐ์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋„๊ตฌ(๋ฉ”์†Œ๋“œ)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Canvas API ์ดˆ๊ธฐ ์„ค์ •

  • ์บ”๋ฒ„์Šค์˜ ํฌ๊ธฐ๋Š” 300px * 150px ๊ฐ€ ๊ธฐ๋ณธ ํฌ๊ธฐ์ด๋‹ค. html์˜ width์™€ height ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • explore 9 ์ดํ•˜ ๋ฒ„์ „์ด๋‚˜ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ € ๋“ฑ ์˜›๋‚  ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” canvas๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด์— ๋Œ€ํ•œ ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด canvas ๋Œ€์ฒด ์ปจํ…์ธ  ๋˜ํ•œ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์ฒด ์ปจํ…์ธ  ์‚ฝ์ž…์€ ๋งค์šฐ ์‰ฝ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด canvas ํƒœ๊ทธ ์•ˆ์— ๋Œ€์ฒด ์ปจํ…์ธ ๋ฅผ ๋„ฃ์œผ๋ฉด, canvas๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ทธ ์†์˜ ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
    • getContext() ๋ฉ”์†Œ๋“œ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด js ์ฝ”๋“œ์—์„œ canvas ํƒœ๊ทธ ์ง€์› ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Canvas API ํ•„์ˆ˜ ์š”์†Œ

  • canvas xormsms ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ๊ผญ ํ•„์š”๋กœ ํ•œ๋‹ค. ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฌธ์„œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ์ปจํ…์ธ ๋กœ ๊ฐ„์ฃผ๋˜์–ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • getContext() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CanvasRenderingContext2D

  • 2D ๊ทธ๋ž˜ํ”ฝ์„ ๊ธฐ๋ฅด๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์บ”๋ฒ„์Šค ๋‚ด 1grid์˜ ๋‹จ์œ„๋Š” 1px๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์›์ ์€ ์ขŒ์ธก ์ƒ๋‹จ(0, 0)์ž…๋‹ˆ๋‹ค.
  • SVG์™€ ๋‹ค๋ฅด๊ฒŒ canvas๋Š” โ€˜์ง์‚ฌ๊ฐํ˜•โ€™ ๋„ํ˜• ๋งŒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ ๋„ํ˜•๋“ค์€ ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜ ํ˜น์€ ํ•˜๋‚˜ ์ด์ƒ์˜ path์™€ ์—ฌ๋Ÿฌ ์ ์œผ๋กœ ์ด์–ด์ง„ ์„ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

METHOD

  • fillRect(x, y, width, height) : ์ƒ‰์น ๋œ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
  • strockRect(x, y, width, height) : ์ง์‚ฌ๊ฐํ˜• ์œค๊ณฝ์„ ์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
  • clearRect(x, y, width, height) : ํŠน์ • ๋ถ€๋ถ„์„ ์ง€์šฐ๋Š” ์ง์‚ฌ๊ฐํ˜•์ด๋ฉฐ, ์ด ์ง€์›Œ์ง„ ๋ถ€๋ถ„์€ ์™„์ „ํžˆ ํˆฌ๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค.
  • rect(x, y, width, height) : ํ˜„์žฌ ์—ด๋ฆฐ path์— ์ง์‚ฌ๊ฐํ˜• ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

drawing Path

  • path(๊ฒฝ๋กœ)๋Š” ์ ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ด ์ ๋“ค์˜ ์ง‘ํ•ฉ์€ ๊ฐ๊ฐ์ด ์—ฐ๊ฒฐ๋˜์–ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋„ํ˜•, ๊ณก์„ , ๋‘๊ป˜, ์„ , ์ƒ‰ ๋“ฑ์„ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • path ์ƒ์„ฑ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆด path(๊ฒฝ๋กœ)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      • beginPath() : ์ƒˆ path๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • moveTo(x, y) : path์˜ ๊ทธ๋ฆฌ๊ธฐ ์ง€์ ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
      • lineTo(x, y) : (x, y) ์ง€์ ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
      • closePath() : ํ˜„์žฌ ํ•˜์œ„ ๊ฒฝ๋กœ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„๊ณผ ์—ฐ๊ฒฐ๋œ ์ง์„ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ตฌ์„ฑํ•œ path๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋“ค์ด ์‹ค์ œ๋กœ ๊ทธ๋ ค์ง€๊ธฐ ์œ„ํ•ด ๋ Œ๋”๋ง ํ์— ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.
      • stroke() : ์œค๊ณฝ์„ ์„ ์ด์šฉํ•˜์—ฌ ๋„ํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
        • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ์—๋Š” โ€˜์„ โ€™์„ ๊ทธ๋ฆฐ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, path๊ฐ€ ๋‹ซํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • fill() : path์˜ ๋‚ด๋ถ€๋ฅผ ์ฑ„์›Œ์„œ ๋‚ด๋ถ€๊ฐ€ ์ฑ„์›Œ์ง„ ๋„ํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
        • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋„ํ˜•์ด ์ž๋™์œผ๋กœ ๋‹ซํžˆ๊ฒŒ ๋˜์–ด closePath()๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (stroke ๋ฉ”์†Œ๋“œ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Œ)
  • path๋Š” ๋„ํ˜•์„ ์ด๋ฃจ๋Š” โ€˜ํ•˜์œ„ pathโ€™ ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. beginpath ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ์ด ํ•˜์œ„ path ์ง‘ํ•ฉ์€ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์ƒˆ ๋„ํ˜•์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • arc, arcTo ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ๋‚˜ ์›์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Path2D ๊ฐ์ฒด

  • ๋“œ๋กœ์ž‰ ๋ช…๋ น์„ ์บ”๋ฒ„์Šค ๋‚ด์— ์บ์‹œํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ก ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • new Path2D() ์ƒ์„ฑ์ž๋Š” ์ƒˆ๋กœ์šด Path2D ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๊ฑฐ๋‚˜(๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑ), SVG ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ›์•„์„œ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
new Path2D(); // empty path object
new Path2D(path); // copy from another Path2D object
new Path2D(d); // path from SVG path data
  • ๋ชจ๋“  path ๋ฉ”์†Œ๋“œ๋Š” Path2D ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • addPath ๋ฉ”์†Œ๋“œ๋กœ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • addPath(path [, transform]) : ์˜ต์…˜์œผ๋กœ ๋ณ€ํ™˜ ํ–‰๋ ฌ(transformation matrix)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๊ฒฝ๋กœ์— ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
function draw() {
  var canvas = document.getElementById("canvas");
  if (canvas.getContext) {
    var ctx = canvas.getContext("2d");

    var rectangle = new Path2D();
    rectangle.rect(10, 10, 50, 50);

    var circle = new Path2D();
    circle.moveTo(125, 35);
    circle.arc(100, 35, 25, 0, 2 * Math.PI);

    ctx.stroke(rectangle);
    ctx.fill(circle);
  }
}
  • SVG Path ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG์™€ canvas์—์„œ ๊ฒฝ๋กœ ๋ช…๋ น์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. var p = new Path2D("M10 10 h 80 v 80 h -80 Z");

์บ”๋ฒ„์Šค ๊พธ๋ฏธ๊ธฐ

Note
์บ”๋ฒ„์Šค ์† ๋‚ด์šฉ์€ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์บ”๋ฒ„์Šค๋ฅผ ์ˆœ์ˆ˜ํžˆ ๊พธ๋ฏธ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, <canvas> ์‹œ์ž‘ ํƒœ๊ทธ์— role="presentation"์„ ๋„ฃ์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์บ”๋ฒ„์Šค ์š”์†Œ์— ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์„ aria-label ์†์„ฑ์˜ ๊ฐ’์œผ๋กœ ๋„ฃ๊ฑฐ๋‚˜, ์บ”๋ฒ„์Šค ํƒœ๊ทธ ์•ˆ์— ๋Œ€์ฒด ๋‚ด์šฉ์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์บ”๋ฒ„์Šค ์† ๋‚ด์šฉ์€ DOM์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ์ค‘์ฒฉ ๋Œ€์ฒด ๋‚ด์šฉ์€ DOM์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ํ˜•์— ์ƒ‰์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • fillStyle = color : ๋„ํ˜•์„ ์ฑ„์šฐ๋Š” ์ƒ‰์„ ์„ค์ •.
  • strokeStyle = color : ๋„ํ˜•์˜ ์œค๊ณฝ์„  ์ƒ‰์„ ์„ค์ •.
    • ์—ฌ๊ธฐ์„œ color๋Š” CSS์˜ , ๊ทธ๋ผ๋””์–ธํŠธ ๊ฐ์ฒด, ํŒจํ„ด ๊ฐ์ฒด ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      strokeStyleย ๋˜๋Š”ย fillStyleย ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด, ์ƒˆ๋กœ ์„ค์ •๋œ ๊ฐ’์ด ์•ž์œผ๋กœ ๊ทธ๋ ค์งˆ ๋„ํ˜•์˜ ๊ธฐ๋ณธ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋„ํ˜•์— ๋‹ค๋ฅธ ์ƒ‰์„ ์ ์šฉํ•˜๋ ค๋ฉดย fillStyleย ๋˜๋Š”ย strokeStyleย ์†์„ฑ์„ ๋‹ค์‹œ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      ctx.fillStyle = "orange";
      ctx.fillStyle = "#FFA500";
      ctx.fillStyle = "rgb(255, 165, 0)";
      ctx.fillStyle = "rgba(255, 165, 0, 1)";
      // ์œ„ ํ˜•ํƒœ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      

ํˆฌ๋ช…๋„ ์ ์šฉ

  • globalAlpah : ๊ฐ™์€ ํˆฌ๋ช…๋„์˜ ๋„ํ˜• ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ทธ๋ฆด ๋•Œ ์œ ์šฉํ•˜๋‹ค. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋กœ ํˆฌ๋ช…๋„๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ดํ›„๋ถ€ํ„ฐ ๊ทธ๋ ค์ง€๋Š” ๋„ํ˜•์€ ๋ชจ๋‘ ์„ค์ •ํ•œ ํˆฌ๋ช…๋„๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
  • css rgba() ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ณ„ ๋„ํ˜•์— ํˆฌ๋ช…๋„ ์ ์šฉ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์„  ๋ฐ ์ฑ„์šฐ๊ธฐ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

์„ ์„ ๊ทธ๋ฆด ๋•Œ bitmap ์ด๋ฏธ์ง€์˜ ํŠน์ง•์œผ๋กœ ์„ ์ด ํ๋ ค์ง€๋Š” ํšจ๊ณผ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์„  ๋‘๊นจ๋ฅผ ์ง์ˆ˜๋กœ ์„ค์ •.

Transformations

  • transformations์—๋Š” ๊ทธ๋ฆฌ๋“œ๋ฅผ ์›์ ์—์„œ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์˜ฎ๊ธฐ๊ณ , ํšŒ์ „ํ•˜๊ณ , ํ™•๋Œ€ ๋ฐ ์ถ•์†Œ๊นŒ์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ์ €์žฅ๊ณผ ๋ณต์›

  • save() : canvas์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • restore() : ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ €์žฅ๋œ canvas ์ƒํƒœ๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
  • canvas ์ƒํƒœ๋Š” ์Šคํƒ์— ์Œ“์ธ๋‹ค. save ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋งˆ๋‹ค ํ˜„์žฌ drawing ์ƒํƒœ๊ฐ€ ์Šคํƒ ์œ„๋กœ ํ‘ธ์‹œ๋œ๋‹ค. drawing ์ƒํƒœ์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • translate, rotate, scale ๋“ฑ
    • attribute ๊ฐ’ : strokeStyle, fillStyle, globalAlpha, lineWidth ๋“ฑ
    • ํ˜„์žฌ์˜ clipping path
  • ๋„ํ˜• ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ๊ทธ ๋„ํ˜•์˜ ์†์„ฑ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
function draw() {
  var ctx = document.getElementById("canvas").getContext("2d");

  ctx.fillRect(0, 0, 150, 150); // ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๊ธฐ
  ctx.save(); // ๊ธฐ๋ณธ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ

  ctx.fillStyle = "#09F"; // ์„ค์ • ๋ณ€๊ฒฝํ•˜๊ธฐ
  ctx.fillRect(15, 15, 120, 120); // ์ƒˆ๋กœ์šด ์„ค์ •์œผ๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

  ctx.save(); // ํ˜„์žฌ ์ƒํƒœ ์ €์žฅํ•˜๊ธฐ
  ctx.fillStyle = "#FFF"; // ์„ค์ • ๋ณ€๊ฒฝํ•˜๊ธฐ
  ctx.globalAlpha = 0.5;
  ctx.fillRect(30, 30, 90, 90); // ์ƒˆ๋กœ์šด ์„ค์ •์œผ๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

  ctx.restore(); // ์ด์ „ ์ƒํƒœ ๋ณต์›ํ•˜๊ธฐ
  ctx.fillRect(45, 45, 60, 60); // ๋ณต์›๋œ ์„ค์ •์œผ๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

  ctx.restore(); // ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ธฐ
  ctx.fillRect(60, 60, 30, 30); // ๋ณต์›๋œ ์„ค์ •์œผ๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ
}

์›์  ์ด๋™

  • translate(x, y)๋Š” ๊ทธ๋ฆฌ๋“œ์—์„œ canvas์˜ ์›์ ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ ์ €์žฅ๊ณผ ๋ณต์› ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์›์ ์„ ์ด๋™ํ•œ ํ›„ ๋‹ค์‹œ (0, 0)์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ ๋ณด๋‹ค, ์ƒํƒœ ์Šคํƒ์— ์ €์žฅ ํ›„ ๋‹ค์‹œ restoreํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.
function draw() {
  var ctx = document.getElementById("canvas").getContext("2d");
  for (var i = 0; i < 3; i++) {
    for (var j = 0; j < 3; j++) {
      ctx.save();
      ctx.fillStyle = "rgb(" + 51 * i + ", " + (255 - 51 * i) + ", 255)";
      ctx.translate(10 + j * 50, 10 + i * 50);
      ctx.fillRect(0, 0, 25, 25);
      ctx.restore();
    }
  }
}

// ์œ„ ์ฝ”๋“œ๋Š” ์‚ฌ๊ฐํ˜•์˜ ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ ๊ทธ๋ฆด ๋•Œ ๋งˆ๋‹ค ์บ”๋ฒ„์Šค ์œ„์น˜๋ฅผ ์˜ฎ๊ฒผ๋‹ค๊ฐ€ ๋‹ค์‹œ restore ํ•ด์ค€๋‹ค.
  • Path2D ๊ฒฝ๋กœ๋ฅผ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ์‚ฌ์šฉํ•  ๋•Œ์—๋„, ์œ„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

rotate

  • ๊ฐ๋„์˜ ๋‹จ์œ„๋Š” ๋„(degree)๊ฐ€ ์•„๋‹Œ ๋ผ๋””์•ˆ(radian)์ž…๋‹ˆ๋‹ค. radians = (Math.PI/180)*degree
  • ํ˜„์žฌ ์›์  ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.

scaling(x, y) - x, y๋Š” ์‹ค์ˆ˜

  • canvas ๋‹จ์œ„๋ฅผ ์ˆ˜ํ‰์œผ๋กœ x๋งŒํผ, ์ˆ˜์ง์œผ๋กœ y๋งŒํผ ํ™•๋Œ€ ๋ฐ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค.
  • ์Œ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ถ•์„ ๋Œ€์นญ ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

transform

  • ๋ณ€ํ™˜ ํ–‰๋ ฌ๋กœ ๋ณ€๊ฒฝํ•  ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ˆ„์ ๋˜์–ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

  • transform(a, b, c, d, e, f)

  • a (m11): ์ˆ˜ํ‰์œผ๋กœ ํ™•๋Œ€ยท์ถ•์†Œํ•˜๊ธฐ

  • *b (m12): ์ˆ˜ํ‰์œผ๋กœ ๋น„์Šค๋“ฌํžˆ ๊ธฐ์šธ์ด๊ธฐ

  • c (m21): ์ˆ˜์ง์œผ๋กœ ๋น„์Šค๋“ฌํžˆ ๊ธฐ์šธ์ด๊ธฐ

  • d (m22): ์ˆ˜์ง์œผ๋กœ ํ™•๋Œ€ยท์ถ•์†Œํ•˜๊ธฐ

  • e (dx): ์ˆ˜ํ‰์œผ๋กœ ์ด๋™ํ•˜๊ธฐ

  • f (dy): ์ˆ˜์ง์œผ๋กœ ์ด๋™ํ•˜๊ธฐ

  • setTransform (a, b, c, d, e, f) : ํ˜„์žฌ์˜ ๋ณ€ํ˜•์„ ์ „์ฒด ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ๋ช…์‹œํ•œ ๋ณ€ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋‚ด๋ถ€ ๋กœ์ง์—์„œ transform์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ€ํ™˜ ํ–‰๋ ฌ ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ๊ณต๋ถ€ํ•ด์•ผ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„ํ˜• ํ•ฉ์„ฑ

  • canvas์— ์ƒˆ๋กœ ๊ทธ๋ ค์ง€๋Š” ๋„ํ˜•๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ „ ๋„ํ˜• ์œ„์— ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ globalCompositeOperation ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๊ทœ์น™ ์™ธ์— ๋‹ค์–‘ํ•œ ๋„ํ˜• ํ•ฉ์„ฑ ๋ฐฉ์‹์œผ๋กœ ๋„ํ˜•์„ ์ด์–ด ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ๋„ํ˜• ๋’ค์— ๊ทธ๋ฆฌ๊ฑฐ๋‚˜, ๋„ํ˜•์˜ ์ผ์ • ์˜์—ญ์„ ๊ฐ€๋ ค ๋ณด์ด์ง€ ์•Š๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ์บ”๋ฒ„์Šค์˜ ํŠน์ • ๋ถ€๋ถ„์„ ์ง€์šฐ๋Š” ๋“ฑ์˜ ํšจ๊ณผ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
globalCompositeOperation = type
//๋„ํ˜• ํ•ฉ์„ฑ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค. 26์ข…๋ฅ˜์˜ ํ•ฉ์„ฑ ๋ฐฉ๋ฒ• ์ค‘ ์„ ํƒ ๊ฐ€๋Šฅํ•˜๋‹ค.

Clipping Path

  • ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ํด๋ฆฌํ•‘ ๋งˆ์Šคํฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • clip() : ํ˜„์žฌ ๊ทธ๋ ค์ง€๋Š” path๋ฅผ ํด๋ฆฌํ•‘ ์˜์—ญ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • path๋ฅผ ๋‹ซ๊ธฐ ์œ„ํ•ด closePath() ๋Œ€์‹  clip()์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ฒฝ๋กœ๋ฅผ ์ฑ„์šฐ๊ฑฐ๋‚˜ ์œค๊ณฝ์„ ์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ํด๋ฆฌํ•‘ ๋งˆ์Šคํฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์š”์†Œ์˜ ์ดˆ๊ธฐ ์„ค์ •๊ฐ’์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์บ”๋ฒ„์Šค๋Š” ์บ”๋ฒ„์Šค ํฌ๊ธฐ์™€ ๋˜‘๊ฐ™์€ ํฌ๊ธฐ์˜ ์ž˜๋ผ๋‚ด๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์ž˜๋ผ๋‚ด๊ธฐ ๊ฒฝ๋กœ๋Š” ๋งˆ์Šคํ‚นํ•  ๋„ํ˜•์˜ ํ•˜๋‹จ์— ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

Pixel ๋‹จ์œ„๋กœ ์ด๋ฏธ์ง€ ์กฐ์ž‘ (Pixel Manipulation)

  • getImageData(x, y, width, height) : ์บ”๋ฒ„์Šค ํŠน์ • ์˜์—ญ์˜ ํ”ฝ์…€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • putImageData(imageData, x, y) : tnwjdgks ImageData ๊ฐ์ฒด๋ฅผ ์บ”๋ฒ„์Šค์— ๋‹ค์‹œ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
  • data ๋ฐฐ์—ด : ImageData์˜ data ์†์„ฑ. ๊ฐ ํ”ฝ์…€์˜ RGBA ๊ฐ’์ด 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • data[i]๋Š” ๋นจ๊ฐ„์ƒ‰, data[i+1]์€ ์ดˆ๋ก์ƒ‰, data[i+2]๋Š” ํŒŒ๋ž€์ƒ‰, data[i+3]์€ ์•ŒํŒŒ(ํˆฌ๋ช…๋„)
  • ์•„๋ž˜๋Š” ํ”ฝ์…€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ‘๋ฐฑ ํ•„๋”๋ฅผ ์ ์šฉํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. (chat-gpt)
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// ์บ”๋ฒ„์Šค์— ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•œ ํ›„ ํ”ฝ์…€ ์กฐ์ž‘ ์‹œ์ž‘
const img = new Image();
img.src = "path/to/your/image.jpg";
img.onload = () => {
  ctx.drawImage(img, 0, 0);
  
  // ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  // ๋ชจ๋“  ํ”ฝ์…€์„ ์ˆœํšŒํ•˜๋ฉฐ ํ‘๋ฐฑ ํ•„ํ„ฐ ์ ์šฉ
  for (let i = 0; i < data.length; i += 4) {
    const r = data[i];     // ๋นจ๊ฐ•
    const g = data[i + 1]; // ์ดˆ๋ก
    const b = data[i + 2]; // ํŒŒ๋ž‘

    // RGB ํ‰๊ท ์„ ๊ณ„์‚ฐํ•ด ํ‘๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜
    const avg = (r + g + b) / 3;
    data[i] = avg;         // ๋นจ๊ฐ•
    data[i + 1] = avg;     // ์ดˆ๋ก
    data[i + 2] = avg;     // ํŒŒ๋ž‘
  }

  // ์ˆ˜์ •๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์บ”๋ฒ„์Šค์— ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ
  ctx.putImageData(imageData, 0, 0);
};

์ตœ์ ํ™” ํŒ

๋ฐ˜๋ณต์ ์œผ๋กœ ๊ทธ๋ฆฌ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ๋น„๊ฐ€์‹œ์šฉ ์บ”๋ฒ„์Šค๋ฅผ ๋งŒ๋“ค์–ด, ๋ฏธ๋ฆฌ ๊ทธ๋ ค ๋„ฃ์–ด๋ผ.

  • ์ดํ›„ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ๋น„๊ฐ€์‹œ์šฉ ์บ”๋ฒ„์Šค์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฃผ ์บ”๋ฒ„์Šค์— ๊ทธ๋ ค๋„ฃ์–ด, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐ˜๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
myCanvas.offscreenCanvas = document.createElement("canvas");
myCanvas.offscreenCanvas.width = myCanvas.width;
myCanvas.offscreenCanvas.height = myCanvas.height;

myCanvas.getContext("2d").drawImage(myCanvas.offScreenCanvas, 0, 0);

๋ถ€๋™ ์†Œ์ˆ˜์  ์ขŒํ‘œ๋ฅผ ํ”ผํ•˜๊ณ  ๋Œ€์‹  ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋ผ.

ctx.drawImage(myImage, 0.3, 0.5);
  • ์œ„ ์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆด ๊ฒฝ์šฐ, ์•ˆํ‹ฐ ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing) ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ถ”๊ฐ€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

drawImage์—์„œ ์ด๋ฏธ๊ธฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์ง€ ๋งˆ๋ผ.

  • drawImage()์—์„œ ์ฆ‰์‹œ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์ง€ ๋ง๊ณ  ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์˜คํ”„์Šคํฌ๋ฆฐ(offscreen) ์บ”๋ฒ„์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์žฅ๋ฉด์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ ˆ์ด์–ด ์บ”๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ.

  • ์บ”๋ฒ„์Šค ์œ„์—์„œ ์ผ๋ถ€ ๋„ํ˜•์€ ์ž์ฃผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ด์•ผํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋„ํ˜•์€ ๊ณ ์ • ์œ„์น˜์— ๋‚จ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋Š” ์บ”๋ฒ„์Šค ๋ ˆ์ด์–ด๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
<div id="stage">
  <canvas id="ui-layer" width="480" height="320"></canvas>
  <canvas id="game-layer" width="480" height="320"></canvas>
  <canvas id="background-layer" width="480" height="320"></canvas>
</div>

ํฐ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” ์ผ๋ฐ˜ CSS๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

  • = ์ •์  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์บ”๋ฒ„์Šค ๋’ท ์ชฝ์— CSS๋กœ ์„ธํŒ…ํ•˜๋ผ.

๊ทธ ์™ธ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ MDN ๋ฌธ์„œ์—์„œ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

์ถ”๊ฐ€ ์ž๋ฃŒ

๐Ÿ˜Ž ์›จ๋ฒ ๋ฒ ๋ฒ ๋ฒฑ

๐Ÿ‘ฎ๐Ÿป ํŒ€ ๊ทœ์น™

๐Ÿ’ป ํ”„๋กœ์ ํŠธ

๐Ÿชต ์›จ๋ฒ ๋ฒฑ ๊ธฐ์ˆ ๋กœ๊ทธ

๐Ÿช„ ๋ฐ๋ชจ ๊ณต์œ 

๐Ÿ”„ ์Šคํ”„๋ฆฐํŠธ ๊ธฐ๋ก

๐Ÿ“— ํšŒ์˜๋ก

Clone this wiki locally