SVG와 HTML5 Canvas의 차이점은 무엇입니까?


92

SVG와 HTML5 Canvas의 차이점은 무엇입니까? 둘 다 나에게 똑같은 일을하는 것 같다. 기본적으로 둘 다 좌표 점을 사용하여 벡터 아트 워크를 그립니다.

내가 무엇을 놓치고 있습니까? SVG와 HTML5 Canvas의 주요 차이점은 무엇입니까? 왜 하나를 선택해야합니까?


4
: 위키 백과는이에 도움이되는 기사가 확장 가능한 벡터 그래픽 대 캔버스 (SVG)
Rudu

내가 이해하는 캔버스는 벡터 그래픽을 제공하지 않습니다. 비트 맵에 관한 모든 것입니다.
Bobby Jack


캔버스는 래스터 그래픽이고 SVG는 확장 가능한 벡터 그래픽입니다. sitePoint 링크 베스트 explaination : sitepoint.com/canvas-vs-svg-choosing-the-right-tool-for-the-job
MechaCode

답변:


43

Wikipedia 참조 : http://en.wikipedia.org/wiki/Canvas_element

SVG는 브라우저에서 도형을 그리기위한 초기 표준입니다. 그러나 SVG는 기본적으로 더 높은 수준에 있습니다. 그 이유는 그려진 각 모양이 장면 그래프 또는 DOM에서 객체로 기억되고 이후에 비트 맵으로 렌더링되기 때문입니다. 즉, SVG 객체의 속성이 변경되면 브라우저가 자동으로 장면을 다시 렌더링 할 수 있습니다.

위의 예에서 직사각형이 그려지면 시스템에서 그려 졌다는 사실을 잊습니다. 위치를 변경하려면 사각형으로 덮일 수있는 모든 개체를 포함하여 전체 장면을 다시 그려야합니다. 그러나 동등한 SVG의 경우 직사각형의 위치 속성을 간단히 변경할 수 있으며 브라우저는이를 다시 그리는 방법을 결정합니다. 캔버스를 레이어로 칠한 다음 특정 레이어를 다시 만드는 것도 가능합니다.

SVG 이미지는 XML로 표현되며 복잡한 장면은 XML 편집 도구로 만들고 유지 관리 할 수 ​​있습니다.

SVG 장면 그래프를 사용하면 이벤트 핸들러를 객체와 연결할 수 있으므로 직사각형이 onClick 이벤트에 응답 할 수 있습니다. 캔버스에서 동일한 기능을 얻으려면 마우스 클릭의 좌표를 그려진 사각형의 좌표와 수동으로 일치시켜 클릭되었는지 여부를 확인해야합니다.

개념적으로 캔버스는 SVG가 구축 될 수있는 하위 수준의 프로토콜입니다. [인용 필요] 그러나 이것은 (일반적으로) 경우가 아니며 독립적 인 표준입니다. Canvas 용 장면 그래프 라이브러리가 있고 SVG에는 비트 맵 조작 기능이 있기 때문에 상황이 복잡합니다.

업데이트 : 마크 업 언어 능력 때문에 SVG를 사용합니다. XSLT로 처리 할 수 ​​있고 노드에 다른 마크 업을 저장할 수 있습니다. 마찬가지로 마크 업 (화학)에 SVG를 포함 할 수 있습니다. 이를 통해 마크 업 조합으로 SVG 속성 (예 : 렌더링)을 조작 할 수 있습니다. 이것은 Canvas에서 가능할 수 있지만 훨씬 더 어렵다고 생각합니다.


2
마지막 단락의 마지막 문장도 인용이 필요합니다. 작성자가 svg 필터 효과를 잘못 표현하려고하지 않는 한 SVG에는 "비트 맵 조작 기능"이 없지만 의미가 명확하지 않습니다.
Erik Dahlström

@Erik 나는 당신과 동의합니다. 이 WP 항목은 편집이 필요한 것 같습니다
peter.murray.rust

대부분의 응용 프로그램에서 SVG가 Canvas보다 우수합니다. 사실인가요? 캔버스가 할 수있는 것이 있지만 SVG가 할 수없는 것이 있습니까?
mcv

나는 그것이 년 후에 알고 있지만 오늘 paper.js 및 fabric.js 같은 많은 캔버스 도서관이있다
lesolorzanov

그것은 우리가 사용하는 가상 DOM 캔버스를 가지고 어떤 경우 개별 개체, 같은 개체 추적 나던 있기 때문에 객체 리플 로우를 일으키는 업데이트를 유지하기 위해 실제 DOM을 사용하기 때문에 SVG 성능에 대한 나쁜, 캔버스 사용에 대한 나쁜
PirateApp

50

SVG는 "그리기"프로그램과 같습니다. 드로잉은 각 모양에 대한 드로잉 지침으로 지정되며 모든 모양의 일부를 변경할 수 있습니다. 드로잉은 모양 지향적입니다.

캔버스는 "페인트"프로그램과 같습니다. 픽셀이 화면에 닿으면 그것이 바로 당신의 그림입니다. 다른 픽셀로 덮어 쓰는 것 외에는 모양을 변경할 수 없습니다. 그림은 픽셀 지향적입니다.

일부 프로그램에서는 도면을 변경할 수있는 것이 매우 중요합니다. 예를 들어 드 래프팅 앱, 다이어그램 작성 도구 등. 따라서 SVG는 여기에서 이점이 있습니다.

일부 예술적 프로그램에서는 개별 픽셀을 제어 할 수있는 것이 중요합니다.

SVG보다 Canvas에서 마우스 드래그를 통한 사용자 조작을위한 뛰어난 애니메이션 성능을 얻는 것이 더 쉽습니다.

컴퓨터 화면의 단일 픽셀은 종종 4 바이트의 정보를 소비하며 요즘 컴퓨터 화면에는 몇 메가 바이트가 걸립니다. 따라서 사용자가 이미지를 편집 한 다음 다시 업로드 할 수 있도록하려면 Canvas가 불편할 수 있습니다.

대조적으로 SVG를 사용하여 전체 화면을 덮는 몇 가지 모양을 그리는 것은 몇 바이트를 차지하고 빠르게 다운로드되며 다른 방향으로 내려갈 때와 동일한 이점으로 쉽게 다시 업로드 할 수 있습니다. 따라서 SVG는 Canvas보다 빠를 수 있습니다.

Google은 SVG로 Google지도를 구현했습니다. 이는 웹 앱에 빠른 성능과 부드러운 스크롤을 제공합니다.


19
당신에게 투표하지 않을 것입니다-새로운 버전의 Google지도는 실제로 svg가 아닌 캔버스를 사용합니다. 이제 svg 버전은 더 이상 사용되지 않습니다.
Duniyadnd 2011

34

Canvas와 SVG의 상위 수준 요약

캔버스

  1. 픽셀 기반 (Dynamic .png)
  2. 단일 HTML 요소 (개발자 도구에서 요소 검사. 캔버스 태그 만 볼 수 있음)
  3. 스크립트를 통해서만 수정
  4. 이벤트 모델 / 사용자 상호 작용은 세분화됩니다 (x, y).
  5. 더 작은 표면, 더 많은 수의 개체 (> 10k) 또는 둘 다에서 성능이 더 좋습니다.

SVG

  1. 모양 기반
  2. DOM의 일부가되는 여러 그래픽 요소
  3. 스크립트 및 CSS를 통해 수정
  4. 이벤트 모델 / 사용자 상호 작용이 추상화 됨 (직사각형, 경로)
  5. 적은 수의 개체 (<10k), 더 큰 표면 또는 둘 다에서 성능이 향상됩니다.

자세한 차이점은 http://msdn.microsoft.com/en-us/library/ie/gg193983(v=vs.85).aspx 를 참조 하십시오.


23

그들이 무엇인지, 그들이 당신을 위해 무엇을하는지에는 차이가 있습니다.

  • SVG는 확장 가능한 벡터 그래픽을위한 문서 형식입니다.
  • Canvas는 벡터 그래픽을 특정 크기의 비트 맵으로 그리기위한 자바 스크립트 API입니다.

형식 대 API에 대해 조금 더 자세히 설명하려면 :

svg를 사용하면 다양한 도구에서 파일을보고, 저장하고, 편집 할 수 있습니다. 캔버스를 사용하면 그냥 그리면 화면의 결과 이미지와 별도로 방금 한 작업에 대해 아무것도 유지되지 않습니다. 두 가지 모두에 애니메이션을 적용 할 수 있으며 SVG는 지정된 요소와 속성 만보고 다시 그리기를 처리하는 반면, 캔버스에서는 API를 사용하여 각 프레임을 직접 다시 그려야합니다. 둘 다 크기를 조정할 수 있지만 SVG는 자동으로 수행하지만 캔버스를 다시 사용하면 주어진 크기에 대한 그리기 명령을 다시 실행해야합니다.


1
아마도 모든 답변 중 가장 공정하고 기술적으로 정확할 것입니다. SVG는 서버 (대부분 정적) 또는 클라이언트 itlsef에서 생성되는 문서 형식입니다. 캔버스 프레임은 그림에 지나지 않습니다. 따라서 당연히 API가있는 다시 그려야합니다.
user568109

10

SVG와 Canvas에서 저를 가장 감동시킨 두 가지는

DOM없이 Canvas를 사용할 수있는 기능. SVG는 DOM에 크게 의존하고 복잡성이 증가함에 따라 성능이 저하됩니다. 게임 디자인처럼.

SVG 사용의 장점은 Canvas에없는 플랫폼간에 해상도가 동일하게 유지된다는 것입니다.

이 사이트에서 더 많은 세부 정보가 제공됩니다. http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/


4

그것은 절대적으로 귀하의 필요 / 요구 사항에 달려 있습니다.

  • 화면에 이미지 / 차트 만 표시하려면 캔버스가 권장됩니다. (예 : PNG, GIF, BMP 등)

  • 예를 들어 차트 위에 마우스를 올려 놓으면 디스플레이 품질을 손상시키지 않고 특정 영역을 확대하려는 경우 그래픽의 기능을 확장하려면 SVG를 선택합니다. (좋은 예는 AutoCAD, Visio, GIS 파일입니다).

셰이프 커넥터가있는 동적 흐름도 생성 도구를 구축하려면 CANVAS보다 SVG를 선택하는 것이 좋습니다.

  • 화면 크기가 커지면 더 많은 픽셀을 그려야하므로 캔버스가 저하되기 시작합니다.

  • 화면에서 개체 수가 증가
    하면 DOM 에 개체 를 계속 추가하면서 SVG 성능이 저하 되기 시작합니다 .

또한 참조하십시오 : http://msdn.microsoft.com/en-us/library/gg193983(v=vs.85).aspx


3

SVG

사용 사례에 따라 SVG는 로고, 차트에 사용됩니다. 그 이유는 벡터 그래픽을 그리고 잊어 버렸기 때문입니다. 크기 조정 (또는 확대 / 축소)과 같이 뷰 포트가 변경되면 자동으로 조정되며 다시 그릴 필요가 없습니다.

캔버스

캔버스는 화면에 픽셀을 페인팅하여 수행되는 비트 맵 (또는 래스터)입니다. 주어진 영역에서 게임이나 그래픽 경험 ( https://www.chromeexperiments.com/webgl ) 을 개발하는 데 사용되며 픽셀을 페인트하고 다른 영역을 다시 그려 변경합니다. 래스터 유형이므로 뷰 포트가 변경되면 완전히 다시 그려야합니다.

참고

http://www.sitepoint.com/7-reasons-to-consider-svgs-instead-of-canvas

http://en.wikipedia.org/wiki/WebGL

http://vector-conversions.com/vectorizing/raster_vs_vector.html


2

SVG파일 형식과 같은 도면의 사양입니다. SVG는 문서입니다. HTML 파일과 같은 SVG 파일을 교환 할 수 있습니다. 또한 SVG 요소와 HTML 요소가 동일한 DOM API를 공유하기 때문에 JavaScript를 사용하여 HTML DOM을 생성하는 것과 동일한 방식으로 SVG DOM을 생성 할 수 있습니다. 그러나 SVG 파일을 생성하기 위해 JavaScript가 필요하지 않습니다. 간단한 텍스트 편집기만으로도 SVG를 작성할 수 있습니다. 그러나 도면에서 도형의 좌표를 계산하려면 최소한 계산기가 필요합니다.

CANVAS그냥 그리기 영역입니다. 캔버스의 내용을 생성하려면 JavaScript를 사용해야합니다. 캔버스를 교환 할 수 없습니다. 문서가 아닙니다. 그리고 캔버스의 요소는 DOM 트리의 일부가 아닙니다. DOM API를 사용하여 캔버스의 내용을 조작 할 수 없습니다. 대신 전용 캔버스 API를 사용하여 캔버스에 모양을 그려야합니다.

의 장점은 SVG도면을 문서로 교환 할 수 있다는 것입니다. 의 장점은 CANVAS내용을 생성하는 데 덜 장황한 JavaScript API가 있다는 것입니다.

다음은 유사한 결과를 얻을 수 있음을 보여주는 예입니다.하지만 JavaScript에서 수행하는 방법은 매우 다릅니다.

// Italic S in SVG

(function () {

  const ns='http://www.w3.org/2000/svg';
  let s = document.querySelector('svg');
  let p = document.createElementNS (ns, 'path');
  p.setAttribute ('id', 'arc');
  p.setAttribute ('d', 'M 0.9 -0.9 a 0.8,0.4 -10 0,0 -0.9,0.9');
  s.appendChild (p);
  let u = document.createElementNS (ns, 'use');
  u.setAttribute ('href', '#arc');
  u.setAttribute ('transform', 'rotate(180)');
  s.appendChild (u);

})();

// Italic S in CANVAS

(function () {

  let c = document.querySelector('canvas');
  let w = c.width = c.clientWidth;
  let h = c.height = c.clientHeight;
  let x = c.getContext('2d');
  x.lineWidth = 0.05 * w;
  x.moveTo (w/2, h/2);
  x.bezierCurveTo (w*0.02, h*0.4,
                   w*0.4, -h*0.02,
                   w*0.95, h*0.05);
  x.moveTo (w/2, h/2);
  x.bezierCurveTo (w*(1-0.02), h*(1-0.4),
                   w*(1-0.4), h*(1+0.02),
                   w*(1-0.95), h*(1-0.05));
  x.stroke();

})();
svg, canvas {
  width: 3em;
  height: 3em;
}

svg {
  vertical-align: text-top;
  stroke: black;
  stroke-width: 0.1;
  fill: none;
}

canvas {
  vertical-align: text-bottom;
}

div {
  float: left;
}
<div><svg viewBox="-1 -1 2 2"></svg>VG</div>
<div>CANVA<canvas></canvas></div>

보시다시피 결과는 거의 동일하지만 JavaScript 코드는 완전히 다릅니다.

SVG는 사용하여 DOM API를 사용하여 생성 createElement, setAttributeappendChild. 모든 그래픽은 속성 문자열에 있습니다. SVG에는 더 강력한 기본 요소가 있습니다. 예를 들어 CANVAS에는 SVG 아크 경로와 동일한 것이 없습니다. CANVAS 예제는 Bezier 곡선으로 SVG 호를 에뮬레이션하려고합니다. SVG에서는 변형을 위해 요소를 재사용 할 수 있습니다. CANVAS에서는 요소를 재사용 할 수 없습니다. 대신 두 번 호출하려면 JavaScript 함수를 작성해야합니다. SVG에는 viewBox정규화 된 좌표를 사용하여 회전을 단순화하는가 있습니다. 캔버스에서 당신은 자신의 기준으로 좌표를 계산해야 clientWidth하고clientHeight. 그리고 CSS로 모든 SVG 요소의 스타일을 지정할 수 있습니다. CANVAS에서는 CSS로 스타일을 지정할 수 없습니다. SVG는 DOM이므로 모든 SVG 요소에 이벤트 핸들러를 할당 할 수 있습니다. CANVAS의 요소에는 DOM과 DOM 이벤트 핸들러가 없습니다.

그러나 반면에 CANVAS 코드는 훨씬 읽기 쉽습니다. XML 네임 스페이스는 신경 쓸 필요가 없습니다. 그리고 DOM을 빌드 할 필요가 없기 때문에 그래픽 함수를 직접 호출 할 수 있습니다.

교훈은 분명합니다. 그래픽을 빠르게 그리려면 CANVAS를 사용하십시오. CSS로 스타일을 지정하거나 그래픽에서 DOM 이벤트 핸들러를 사용하려는 등 그래픽을 공유해야하는 경우 SVG를 빌드하십시오.


1

위의 포인트에 추가 :

SVG는 JPEG, GIF 등과 비교할 때 웹을 통해 전송하기에 가벼우 며 품질 저하없이 크기를 조정할 때 매우 확장됩니다.


0

SVG
Object Model 기반입니다.
큰 렌더링 영역을 사용하는 데 적합합니다.
SVG는 이벤트 핸들러에 대한 모든 지원을 제공합니다.
스크립트 및 CSS를 통해 수정이 가능합니다.
SVG는 더 나은 확장 성을 가지고 있습니다.
SVG는 벡터 기반입니다 (모양으로 구성됨).
SVG는 게임 그래픽에 적합하지 않습니다. SVG는 해상도에 의존하지 않습니다.
SVG는 API 애니메이션에 사용할 수 있습니다.
SVG는 고품질 및 모든 해상도로 인쇄하는 데 적합합니다.

캔버스 요소

픽셀 기반입니다.

작은 렌더링 사용에 적합

Canvas는 이벤트 핸들러에 대한 어떠한 자원도 제공하지 않습니다.

수정은 스크립트를 통해서만 허용됩니다.

캔버스는 확장 성이 떨어집니다.

캔버스는 래스터 기반 (픽셀로 구성됨)입니다.

캔버스는 게임 그래픽에 적합합니다.

캔버스는 해상도에 전적으로 의존합니다.

Canvas에는 애니메이션 용 API가 없습니다.

캔버스는 고품질 및 고해상도 인쇄에 적합하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.