Открыть сервисСервис

Canvas — технология рисования в браузере

Canvas (полное название — HTML5 Canvas) — элемент разметки HTML, предоставляющий программный интерфейс для двумерного рисования средствами скриптового языка JavaScript. Представляет собой прямоугольную область на веб-странице, на которую можно выводить графику: линии, фигуры, изображения, текст, анимацию. Технология является частью стандарта HTML5 и поддерживается всеми современными браузерами.

История

Элемент <canvas> был впервые представлен компанией Apple в 2004 году для реализации виджетов в браузере Safari. В 2005 года технология была описана в документации Apple, а затем подхвачена Mozilla и Opera. В 2006 года Mozilla и Apple совместно передали спецификацию в консорциум W3C. Стандарт Canvas 2D стал частью спецификации HTML5, а в 2012 году W3C опубликовал рекомендацию Canvas Level 1. Параллельно разрабатывался API WebGL для трёхмерной графики на основе canvas.

Устройство и API

Canvas представляет собой растровую (пиксельную) поверхность. По умолчанию размер области составляет 300×150 пикселей, но может задаваться атрибутами width и height. В отличие от векторного формата SVG, содержимое canvas после отрисовки не является объектной моделью: изменить отдельную нарисованную фигуру задним числом нельзя, только перерисовать всю сцену.

Для работы с canvas используется объект CanvasRenderingContext2D, получаемый методом getContext('2d'). Основные возможности контекста:

  • рисование линий, прямоугольников, дуг, кривых Безье;
  • заливка и обводка с заданными цветами, градиентами и шаблонами;
  • работа с текстом (шрифты, выравнивание, измерение);
  • операции с изображениями (масштабирование, поворот, обрезка);
  • трансформации (сдвиг, поворот, масштабирование, отражение);
  • композитинг и прозрачность;
  • управление отдельными пикселями через ImageData.

Для трёхмерной графики используется контекст webgl, реализующий OpenGL ES 2.0 в браузере.

Принцип работы

Canvas рисует пиксели, а не объекты. Каждый вызов метода контекста немедленно (или в ближайший кадр) преобразуется в изменение пикселей на поверхности. Для создания анимации используется метод requestAnimationFrame, который синхронизирует перерисовку с частотой обновления экрана (обычно 60 кадров в секунду). Сцену приходится перерисовывать целиком на каждом кадре.

Применение

Технология canvas применяется в самых разных областях веб-разработки:

  • Игры и анимации — canvas является основой большинства браузерных игр, включая 2D-игры и игры с простой 3D-графикой на WebGL.
  • Визуализация данных — построение диаграмм, графиков, карт (библиотеки D3.js, Chart.js, ECharts).
  • Обработка изображений — фильтры, редактирование фотографий, компоновка изображений, создание миниатюр.
  • Генерация изображений — создание капчи, QR-кодов, водяных знаков, синтез текстур.
  • Рисование и рукописный ввод — приложения для эскизов, интерактивные доски, подпись документов.
  • Визуализация звука — осциллограммы, спектрограммы.
  • Распознавание и обработка видео — анализ кадров с веб-камеры (связка с API getUserMedia).

Canvas и SVG

ХарактеристикаCanvasSVG
Тип графикиРастроваяВекторная
Объектная модельОтсутствуетКаждый элемент — объект
Изменение отдельного элементаНевозможно без перерисовкиВозможно
МасштабированиеС потерей качестваБез потерь
Производительность при большом числе объектовВысокаяНиже
События на элементахНет (нужен ручной hit-test)Есть
Подходит дляАнимации, игр, фильтровДиаграммы, иконки, интерфейсы

Особенности и ограничения

Canvas является растровым, поэтому при масштабировании изображение может размываться. Содержимое canvas нельзя выделить мышью, скопировать как текст или индексировать поисковыми системами. Доступ к пикселям другого домена ограничен политикой same-origin policy. Размер площади ограничен браузером: в Chrome и Firefox предел составляет около 16 384 пикселей по каждой стороне, суммарная площадь также может быть ограничена (обычно не более 268 миллионов пикселей).

Популярные библиотеки

Для работы с canvas создано множество JavaScript-библиотек: Fabric.js (объектная модель поверх canvas), Konva (интерактивные сцены), PixiJS (высокопроизводительная 2D-графика), p5.js (творческое программирование), Paper.js (векторная графика), Three.js (3D-графика на WebGL).

Источники

  • Спецификация W3C Canvas Level 1
  • MDN Web Docs: HTMLCanvasElement
  • Документация Apple по элементу canvas (2005)
  • HTML Living Standard, WHATWG
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru