icon안동민 개발노트

Canvas API 기초


 Canvas API는 HTML5에서 도입된 강력한 2D 그래픽 시스템으로, 자바스크립트를 사용하여 동적으로 그래픽을 생성하고 조작할 수 있게 해줍니다.

 이 API는 게임 개발, 데이터 시각화, 이미지 편집 등 다양한 웹 애플리케이션에서 활용됩니다.

Canvas 기본 사용법

 HTML에서 canvas 요소를 추가합니다.

<canvas id="myCanvas" width="500" height="300"></canvas>

 자바스크립트에서 canvas 요소와 2D 렌더링 컨텍스트를 가져옵니다.

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

기본 도형 그리기

  1. 직선 그리기
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(200, 200);
ctx.stroke();
  1. 사각형 그리기
ctx.fillStyle = 'blue';
ctx.fillRect(50, 50, 100, 80);
  1. 원 그리기
ctx.beginPath();
ctx.arc(100, 100, 50, 0, Math.PI * 2);
ctx.fill();

색상과 스타일

  1. 선 스타일
ctx.strokeStyle = 'red';
ctx.lineWidth = 5;
  1. 채우기 스타일
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';

패스와 곡선

  1. 베지에 곡선
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.bezierCurveTo(20, 100, 200, 100, 200, 20);
ctx.stroke();

텍스트 렌더링

ctx.font = '30px Arial';
ctx.fillText('Hello Canvas!', 10, 50);

이미지 조작

const img = new Image();
img.onload = function() {
  ctx.drawImage(img, 0, 0);
};
img.src = 'example.jpg';

변형

  1. 이동 (Translate)
ctx.translate(100, 100);
  1. 회전 (Rotate)
ctx.rotate(Math.PI / 4);
  1. 크기 조절 (Scale)
ctx.scale(2, 2);

합성

  1. 투명도
ctx.globalAlpha = 0.5;
  1. 합성 연산
ctx.globalCompositeOperation = 'multiply';

애니메이션

 requestAnimationFrame을 사용한 간단한 애니메이션

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  // 그리기 로직
  requestAnimationFrame(draw);
}
 
draw();

성능 최적화

  1. 오프스크린 캔버스 사용
  2. 불필요한 상태 변경 최소화
  3. 적절한 캔버스 크기 사용
  4. 복잡한 경로는 미리 계산하여 저장

Canvas vs SVG

 Canvas

  • 픽셀 기반 렌더링
  • 고성능 애니메이션에 적합
  • 복잡한 장면에 유리

 SVG

  • 벡터 기반 렌더링
  • 확장성이 뛰어남
  • DOM 조작 가능

실제 애플리케이션 사례

  1. 데이터 시각화
function drawBarChart(data) {
   data.forEach((value, index) => {
      ctx.fillRect(index * 60, canvas.height - value, 50, value);
   });
}
  1. 간단한 게임
let x = 0, y = 0;
 
function gameLoop() {
   ctx.clearRect(0, 0, canvas.width, canvas.height);
   ctx.fillRect(x, y, 50, 50);
   x += 5;
   requestAnimationFrame(gameLoop);
}
 
gameLoop();

WebGL과의 관계

 Canvas API가 2D 그래픽을 다룬다면, WebGL은 3D 그래픽을 위한 API입니다. WebGL은 Canvas 요소를 사용하지만, 더 복잡하고 강력한 기능을 제공합니다.

 Canvas API는 웹에서 동적이고 인터랙티브한 그래픽을 생성하는 강력한 도구입니다. 2D 렌더링 컨텍스트를 통해 다양한 그래픽 작업을 수행할 수 있으며, 이는 웹 개발에서 광범위하게 활용됩니다.

 Canvas의 주요 장점 중 하나는 픽셀 수준의 제어가 가능하다는 점입니다. 이는 복잡한 그래픽이나 고성능 애니메이션이 필요한 경우에 특히 유용합니다. 게임 개발, 데이터 시각화, 이미지 처리 등 다양한 분야에서 Canvas API가 활용되고 있습니다.

 기본적인 도형 그리기부터 시작해서, 색상과 스타일 적용, 패스와 곡선 생성, 텍스트 렌더링, 이미지 조작 등 Canvas API는 다양한 그래픽 기능을 제공합니다. 또한 변형과 합성 기능을 통해 더욱 복잡하고 동적인 그래픽을 만들 수 있습니다.

 애니메이션 구현에 있어서 requestAnimationFrame의 사용은 매우 중요합니다. 이 메서드는 브라우저의 리페인트 주기에 맞춰 애니메이션을 실행하므로, 부드럽고 효율적인 애니메이션을 구현할 수 있습니다.

 Canvas를 사용할 때 성능 최적화는 중요한 고려사항입니다. 오프스크린 캔버스 사용, 불필요한 상태 변경 최소화, 적절한 캔버스 크기 사용 등의 기법을 통해 성능을 향상시킬 수 있습니다.

 Canvas와 SVG는 각각의 장단점이 있습니다. Canvas는 픽셀 기반 렌더링으로 고성능 애니메이션에 적합하지만, SVG는 벡터 기반으로 확장성이 뛰어나고 DOM 조작이 가능합니다. 프로젝트의 요구사항에 따라 적절한 기술을 선택해야 합니다.

 실제 애플리케이션에서 Canvas API는 다양하게 활용됩니다. 데이터 시각화에서는 복잡한 차트나 그래프를 그리는 데 사용되며, 게임 개발에서는 게임 세계와 캐릭터를 렌더링하는 데 사용됩니다. 이미지 편집 도구나 그래픽 디자인 애플리케이션에서도 Canvas API가 중요한 역할을 합니다.

 Canvas API와 WebGL은 밀접한 관련이 있습니다. WebGL은 Canvas 요소를 사용하여 3D 그래픽을 렌더링합니다. WebGL은 더 복잡하고 강력한 기능을 제공하지만, 학습 곡선이 더 가파르고 사용이 복잡합니다.

 결론적으로, Canvas API는 웹에서 그래픽을 다루는 강력하고 유연한 도구입니다. 기본적인 사용법부터 고급 기능까지 익히면, 웹에서 다양하고 인터랙티브한 시각적 경험을 만들 수 있습니다. 성능 최적화와 적절한 사용 사례 선택이 중요하며, 지속적인 학습과 실험을 통해 Canvas API의 잠재력을 최대한 활용할 수 있습니다.