В чем разница между SVG и HTML5 Canvas? - PullRequest
89 голосов
/ 14 февраля 2011

Чем отличаются SVG и HTML5 Canvas?Они оба, кажется, делают то же самое для меня.По сути, они оба рисуют векторные изображения с использованием координатных точек.

Чего мне не хватает?Каковы основные различия между SVG и HTML5 Canvas?Почему я должен выбирать один над другим?

Ответы [ 9 ]

46 голосов
/ 19 февраля 2011

SVG - это программа для рисования. Чертеж указан как инструкция для каждой фигуры, и любая часть любой фигуры может быть изменена Чертежи ориентированы по форме.

Canvas - это программа для рисования. Как только пиксели попадают на экран, это ваш рисунок. Вы не можете изменять формы, кроме как перезаписывая их другими пикселями. Картины ориентированы на пиксели.

Возможность изменять чертежи очень важна для некоторых программ; например создание приложений, создание диаграмм и т. д. Таким образом, SVG имеет здесь преимущество.

Возможность управлять отдельными пикселями важна для некоторых художественных программ.

С Canvas проще получить отличную производительность анимации для манипулирования пользователями с помощью перетаскивания мышью.

Один пиксель на экране компьютера часто потребляет 4 байта информации, а экран компьютера в наши дни занимает несколько мегабайт. Поэтому Canvas может быть неудобен, если вы хотите, чтобы пользователь отредактировал изображение, а затем снова загрузил его.

В отличие от этого, рисование нескольких фигур, которые покрывают весь экран с использованием SVG, занимает несколько байтов, быстро загружается и может быть легко загружено снова с теми же преимуществами, действующими в этом направлении, что и в другом направлении. Так что SVG может быть быстрее, чем Canvas.

Google реализовал Карты Google с SVG. Это дает веб-приложению высокую производительность и плавную прокрутку.

40 голосов
/ 14 февраля 2011

См. Википедию: 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, но я подозреваю, что это намного сложнее.

30 голосов
/ 10 декабря 2014

Сводка высокого уровня Canvas и SVG

Canvas

  1. Пиксельная (Dynamic .png)
  2. Отдельный элемент HTML.(Проверьте элемент в инструменте разработчика. Вы можете видеть только тег Canvas)
  3. Изменено только с помощью сценария
  4. Модель события / взаимодействие с пользователем гранулировано (x, y)
  5. Производительность равналучше с меньшей поверхностью, большим количеством объектов (> 10k) или обоими

SVG

  1. На основе формы
  2. Несколько графических элементов, которые становятся частью DOM
  3. Модифицировано с помощью скрипта и CSS
  4. Модель события / взаимодействие с пользователем абстрагируется (прямоугольник, путь)
  5. Производительность лучше при меньшемколичество объектов (<10k), большая поверхность или оба </li>

Для получения подробной разницы читайте http://msdn.microsoft.com/en-us/library/ie/gg193983(v=vs.85).aspx

22 голосов
/ 14 февраля 2011

Есть разница в том, что они из себя представляют, и что они для вас делают.

  • SVG - это формат документа для масштабируемой векторной графики.
  • Canvas - это API-интерфейс JavaScript для рисованиявекторная графика в растровом изображении определенного размера.

Чтобы немного рассказать о формате и API:

С помощью svg вы можете просматривать, сохранять и редактировать файл с помощью множества различных инструментов.,С помощью canvas вы просто рисуете, и ничего не сохраняется в том, что вы только что сделали, кроме получающегося изображения на экране.Вы можете анимировать оба, SVG обрабатывает перерисовку для вас, просто просматривая указанные элементы и атрибуты, в то время как с canvas вы должны перерисовывать каждый кадр самостоятельно, используя API.Вы можете масштабировать и то, и другое, но SVG делает это автоматически, в то время как снова с canvas вы должны повторно выполнить команды рисования для заданного размера.

10 голосов
/ 12 октября 2012

Две вещи, которые поразили меня больше всего для SVG и Canvas, были

Возможность использовать Canvas без DOM, поскольку SVG сильно зависит от DOM и по мере увеличения сложности производительность замедляется. Как в игровом дизайне.

Преимущество использования SVG заключается в том, что разрешение остается одинаковым для всех платформ, которых нет в Canvas.

На этом сайте предоставлена ​​более подробная информация. http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/

4 голосов
/ 03 июня 2014

Это абсолютно зависит от ваших потребностей / требований.

  • Если вы хотите просто показать изображение / диаграмму на экране, тогда рекомендуется использовать метод canvas.(Например, PNG, GIF, BMP и т. Д.)

  • Если вы хотите расширить возможности вашей графики, например, если вы наводите курсор мыши на график, хотите увеличить определенную область без отображения испорченных изображенийКачество, то вы выбираете SVG.(Хороший пример - файлы AutoCAD, Visio, GIS).

Если вы хотите создать инструмент создания динамических потоковых диаграмм с соединителем формы, лучше выбрать SVG, а не CANVAS.

  • Когда размер экрана увеличивается, холст начинает ухудшаться по мере того, как нужно рисовать больше пикселей.

  • Когда на экране увеличивается количество объектов, SVG начинает ухудшаться
    , поскольку мы постоянно добавляем их в DOM.

Также, пожалуйста, обратитесь: http://msdn.microsoft.com/en-us/library/gg193983(v=vs.85).aspx

3 голосов
/ 17 февраля 2016

SVG

В зависимости от варианта использования SVG используется для логотипов, диаграмм, потому что свою векторную графику вы рисуете и забыли об этом.При изменении вида порта, например, при изменении его размера (или увеличении), он будет саморегулироваться и не нужно перерисовывать.

Canvas

Canvas - растровое изображение (или растр) - сделанопутем рисования пикселей на экране.Он используется для разработки игр или графического интерфейса (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 голосов
/ 12 декабря 2017

SVG - это спецификация чертежа, подобного формату файла. SVG - это документ. Вы можете обмениваться файлами SVG, такими как файлы HTML. Кроме того, поскольку элементы SVG и элементы HTML используют один и тот же API-интерфейс DOM, можно использовать JavaScript для создания SVG-DOM таким же образом, как и для создания HTML-DOM. Но вам не нужен JavaScript для генерации файла SVG. Для написания SVG достаточно простого текстового редактора. Но вам нужен хотя бы калькулятор для расчета координат фигур на чертеже.

CANVAS это просто область рисования. Для генерации содержимого холста необходимо использовать JavaScript. Вы не можете обменять холст. Это не документ. И элементы canvas не являются частью дерева DOM. Вы не можете использовать DOM API для управления содержимым холста. Вместо этого вам нужно использовать специальный API Canvas для рисования фигур на холсте.

Преимущество 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, setAttribute и appendChild. Вся графика находится в строках атрибутов. SVG имеет более мощные примитивы. Например, у CANVAS нет ничего, эквивалентного траектории дуги SVG. Пример CANVAS пытается эмулировать дугу SVG с кривой Безье. В SVG вы можете повторно использовать элементы для их преобразования. В холсте вы не можете повторно использовать элементы. Вместо этого вам нужно написать функцию JavaScript, чтобы вызвать ее дважды. SVG имеет viewBox, что позволяет использовать нормализованные координаты, что упрощает вращение. В ХОЛСТЕ вы должны рассчитать координаты самостоятельно, основываясь на clientWidth и clientHeight. И вы можете стилизовать все элементы SVG с помощью CSS. В холсте вы ничего не можете стилизовать с помощью CSS. Поскольку SVG является DOM, вы можете назначить обработчики событий для всех элементов SVG. Элементы в CANVAS не имеют ни DOM, ни обработчиков событий DOM.

Но, с другой стороны, код CANVAS гораздо легче читать. Вам не нужно заботиться о пространствах имен XML. И вы можете напрямую вызывать графические функции, потому что вам не нужно создавать DOM.

Урок понятен: если вы хотите быстро нарисовать графику, используйте CANVAS. Если вам нужно поделиться графикой, например, стилизовать ее с помощью CSS или использовать обработчики событий DOM в своей графике, создайте SVG.

0 голосов
/ 03 мая 2015

добавление к вышеуказанным пунктам:

SVG облегчает передачу по сети по сравнению с JPEG, GIF и т. Д., А также масштабируется при изменении размера без потери качества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...