Книга: Выразительный JavaScript
Изображения
Изображения
В компьютерной графике проводится различие между векторной и растровой графикой. Первая – то, чем мы занимались в этой главе, рисование при помощи логических описаний форм. Вторая – не задаёт формы, а работает на уровне пикселей.
Метод drawImage
позволяет выводить на холст пиксельные данные. Они могут быть взяты из элемента <img>
или с другого холста, которые не обязательно видны в самом документе. Следующий пример создаёт элемент <img>
и загружает в него файл изображения. Но он не может сразу начать рисовать при помощи этой картинки, потому что браузер мог не успеть её подгрузить. Для этого мы регистрируем обработчик события “load”
и рисуем после загрузки.
<canvas></canvas>
<script>
var cx = document.querySelector("canvas").getContext("2d");
var img = document.createElement("img");
img.src = "img/hat.png";
img.addEventListener("load", function() {
for (var x = 10; x < 200; x += 30)
cx.drawImage(img, x, 10);
});
</script>
По умолчанию drawImage
нарисует картинку оригинального размера. Ему можно задать два дополнительных параметра для изменения ширины и высоты.
Когда drawImage
задано девять аргументов, её можно использовать для рисования части изображения. Со второго по пятый аргументы обозначают прямоугольник (x, y, ширина и высота) в исходной картинке, который надо скопировать. С шестого по девятый – прямоугольник на холсте, куда его надо скопировать.
Это можно использовать, чтобы упаковывать несколько спрайтов (элементов картинки или кадров анимации) в один файл изображения, и рисовать только нужные его части. К примеру, есть у нас картинка игрового персонажа в разных позах:
Перебирая позы, мы можем вывести анимацию идущего персонажа.
Для анимации на холсте пригодится метод clearRect
. Он напоминает fillRect
, но вместо окраски прямоугольника он делает его прозрачным, удаляя предыдущие пиксели.
Мы знаем, что каждый спрайт шириной 24 и высотой 30 пикселей. Следующий код загружает картинку и задаёт интервал для рисования следующих кадров:
<canvas></canvas>
<script>
var cx = document.querySelector("canvas").getContext("2d");
var img = document.createElement("img");
img.src = "img/player.png";
var spriteW = 24, spriteH = 30;
img.addEventListener("load", function() {
var cycle = 0;
setInterval(function() {
cx.clearRect(0, 0, spriteW, spriteH);
cx.drawImage(img,
// source rectangle
cycle * spriteW, 0, spriteW, spriteH,
// destination rectangle
0, 0, spriteW, spriteH);
cycle = (cycle + 1) % 8;
}, 120);
});
</script>
Переменная cycle
отслеживает позицию в анимации. Каждый кадр она увеличивается и по достижению 7 начинает сначала, используя оператор деления с остатком. Она используется для подсчёта координаты x, на которой в изображении находится спрайт с нужной позой.
- Как уменьшить размер изображения, чтобы оно быстрее загружалось через Интернет?
- При просмотре новых фильмов звук есть, а изображения нет. Что делать?
- Урок 2.7. Работа с изображениями в Windows
- Действия с изображениями
- Практическая работа 15. Работа с изображениями в Проводнике
- Нет изображения при воспроизведении видео или появляется сообщение об ошибке загрузки кодека
- Захват изображения
- Элемент D5 Изображения в свободном доступе
- Параметры изображения
- Как вставить в письмо изображения?
- Как просмотреть изображения?
- Проверка попадания в область изображения