Наверх

Загрузка постов


CodeMatrix

A+ R A-

Canvas в двух словах

Научиться работать с тегом html5 “Canvas” (что переводится как «Холст») достаточно просто, хотя, конечно, без знания основ работы с html и javascript не обойтись. Цель данной статьи – не развернутый курс по работе с canvas, а краткое введение для начинающих, после которого, пользуясь справочной информацией вроде приведенных здесь шести статей вы сможете адекватно ориентироваться в нем и работать с ним.

Чтобы понять, насколько проста работа с canvas, не поленимся создать пустой html-файлик и разместим в нем следующий код:

<!DOCTYPE html>
<body>
<canvas width="200" height="200" id="my-canvas">Обновите браузер!</canvas>
<script>
var mycvs = document.getElementById("my-canvas");
var myctxt = mycvs.getContext("2d");
myctxt.fillRect(0, 0, 100, 100);
</script>
</body>
</html>

Запустив файл, вы получите на экране некое подобие шедевра Малевича. Откуда же оно берется? Пропустив информацию по базовым html-тегам, перейдем сразу к главному:

Тег canvas создает на странице новый элемент – холст для рисования. От нас требуется задать размеры этого холста (атрибуты width и height – ширина и высота), а также задать id, через который мы будем к нему обращаться. Холст готов для рисования, но пока пуст.

Рисование, естественно, происходит командами js. Как мы видим, их потребовалось всего три. В первой строке происходит присваивание переменной mycvs объекта холста HTMLCanvasElement (определение которого происходит как раз по id, ибо их (канвасов) на странице может быть много). Во второй – присваиваем переменной myctxt, с которой теперь и будем в основном работать, контекста рисования данного холста. Далее начинается само рисование. Как нетрудно догадаться, метод fillRect рисует на заданном холсте прямоугольник с указанными координатами (первые два параметра) и указанных размеров (следующие два).

//Попробуем изменить скрипт, добавив в него строку:
var mycvs = document.getElementById("my-canvas");
var myctxt = mycvs.getContext("2d");
myctxt.fillRect(0, 0, 100, 100);
myctxt.fillRect(50, 50, 100, 100);

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

Не вдаваясь в подробности, сообщим, что так же существуют методы для рисования иных простых фигур – кругов, а также сложных, состоящих из точек, соединенных прямыми или кривыми Безье и заливки. Эти и любые другие методы более детально можно рассмотреть в вышеприведенных и любых других справочных статьях. А мы коснемся более интересных тем.

Для анимации, реализуемой, как правило, через метод setInterval, предусмотрены такие методы, как метод очистки куска холста для перерисовки clearRect (с теми же параметрами, что и для рисования квадрата), методы сохранения состояния холста и его восстановления save() и restore(), а также, например, методы, отвечающие за вращение или трансформирование: rotate и transform.

Но, естественно, существенный момент для Web-графики – это вывод на холст изображений. Вот тут остановимся поподробнее. Делается это методом drawImage, однако требует чуть большей подготовки, чем рисование квадрата. Во-первых создадим объект javascript изображение (можно дописать после вышеприведенного примера):

var myImg = new Image();
//Во-вторых, зададим путь до файла этого изображения (используйте свой):
myImg.src = "myimg.png"; // или другой путь к файлу
//И, наконец, после загрузки изображения (onload), выведем его на холст:
myImg.onload = function() {
myctxt.drawImage(myImg, 0, 0);
}

После того, как изображение загрузится из указанного файла, оно будет выведено на холст в точке с координатами 0, 0. Соответственно, координаты можно изменить. Можно также добавить методу еще два параметра – ширину и высоту выводимого изображения: myctxt.drawImage(myImg, 0, 0, 150, 80). Параметров может быть также девять: myctxt.drawImage(myImg, 10, 10, 150, 80, 0, 0, 150, 80). В этом случае первые четыре параметра, следующие за переменной myImg описывают фрагмент изображения, который будет выводиться (т.е. оно выводится не целиком), а следующие четыре – место на холсте, куда он будет выводиться.

Выводимые изображения лепятся друг на друга по той же системе, что и остальные объекты, подобно слоям фотошопа. При этом мы можем управлять закономерностью их наложения. Для этого существует свойство globalCompositeOperation, определяемое перед выводом изображения, которое может получать значения:

source-over – новая фигура накладывается на старую (по умолчанию)

source-in – отображается только часть новой фигуры, совпадающая со старой. Остальная часть новой фигуры и старая фигура не выводятся

source-atop – аналогично предыдущему, но старая фигура также выводится, происходит только обрезка новой

destination-over – наложение старой фигуры поверх новой

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

myctxt.drawImage(msk, 0, 0);
myctxt.globalCompositeOperation = "source-in";
myctxt.drawImage(mskdImage, 0, 0, 300, 200);
//где изображение mskdImage обрезается по контуру изображения msk, а изображение-маска msk не выводится, а только задает контур для обрезки.

Предусмотрена в канвасе и маска – clip() – но, увы, маской в данном случае может являться только геометрическая фигура, созданная самим канвасом, а не свободное изображение.

И последнее, о чем сегодня стоит упомянуть – это полезное свойство канваса, позволяющее превратить результаты нашего рисования обратно в изображение. Для этого существует метод toDataURL. Он возвращает из указанного холста (ВНИМАНИЕ – холста, т.е. mycvs а не myctxt в нашем примере) данные изображения, выстроенные в виде интернет-адреса (по умолчанию, если не заданы параметры, говорящие об ином, изображение рассматривается как png). Т.е. выводим данные из объекта холста:

var myImgData = mycvs.toDataURL();
//Полученные данные мы можем использовать для вывода на экран, использовав вместо url-адреса изображения:
var myImgTwo = new Image();
var myImgData = mycvs.toDataURL();
myImgTwo.src = myImgData;

или

document.getElementByTagName("img").src = myImgData;
//а также для сохранения этих данных в базу или файл.

Вот и все. Надеюсь полученных данных вам хватит для начала ознакомления с тегом html-5 canvas, ибо оно того стоит а познаний требует не столь уж масштабных – по сути для первичного ознакомления с ним хватит дня, остальное придет в процессе. Удачных вам экспериментов!