Изображения

Подготовили: Евгений Рыжков и Татьяна Головко Дата публикации: 16.03.2011
IE Firefox Safari Chrome Opera iPhone Android
7.0+ 3.0+ 3.0+ 3.0+ 10.0+ 1.0+ 1.0+

для IE требуется библиотека explorercanvas.

На этой иллюстрации показано, как отображается рисунок с котом, вставленный с помощью тега <img>

милый котик

А тут, тот же рисунок отображенный на холсте:

милый котик-2

Контекст холста предоставляет несколько методов отрисовки изображений:

  • drawImage(image, dx, dy) — отображает указанный рисунок по заданным координатам. Эти координаты будут верхним левым углом рисунка. Координаты (0, 0) отбразят рисунок в верхнем левом углу холста;
  • drawImage(image, dx, dy, dw, dh) — получает изображение, масштабирует его до dw по ширине и dh по высоте, а затем выводит его с точки (dx, dy);
  • drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) — получает изображение, обрезает его по заданному прямоугольнику (sx, sy, sw, sh), масштабирует согласно (dw, dh) и затем отображает на холсте в указанных координатах (dx, dy).

Спецификация HTML5 поясняет параметры drawImage() следующим образом:

Исходный прямоугольник — это прямоугольник (в пределах исходного изображения) чьи вершины совпадают с точками (sx, sy), (sx+sw, sy), (sx+sw, sy+sh), (sx, sy+sh).

Результирующий прямоугольник — это прямоугольник (на холсте) чьи вершины совпадают с точками (dx, dy), (dx+dw, dy), (dx+dw, dy+dh), (dx, dy+dh).

Попытаюсь пояснить это с помощью рисунка:

отображение рисунка на холсте

Чтобы отобразить изображение на холсте, нужно иметь это изображение. Это может быть элемент <img> или объект Image созданный Javascript. В любом случае, изображение должно быть полностью загружено, прежде чем его можно будет отобразить на холсте.

Если использовать существующий элемент <img>, то можно смело отображать изображение на холсте во время события window.onload:

<img id="cat" src="images/cat.png" alt="sleeping cat" width="177" height="113">
<canvas id="e" width="177" height="113"></canvas>
<script>
window.onload = function() {
var canvas = document.getElementById("e");
var context = canvas.getContext("2d");
var cat = document.getElementById("cat");
context.drawImage(cat, 0, 0);
};
</script>

Если объект Image создается с помощью Javascript, на холсте можно будет отобразить изображение по событию Image.onload:



Третий и четвертый параметры метода drawImage() являются необязательными и отвечают за масштабирование изображения. На следующем рисунке изображение кошки уменьшено в масштабе вполовину по высоте и ширине. Плюс отображено несколько раз в пределах одного холста:

мульти-кошка

Данный скрипт воспроизведет «эффект мульти-кошки»:

cat.onload = function() {
for (var x = 0, y = 0;
x < 500 && y < 375;
x += 50, y += 37) {
context.drawImage(cat, x, y, 88, 56);
}
};

Этот пример может породить у тебя ряд вопросов:

  • во-первых, зачем так напрягаться всего лишь ради отображения картинки на холсте?
  • во-вторых, какие дивиденды приносит данный вариант по сравнению с использованием обычного <img> в сочетании с CSS? Мы можем даже воспроизвести «эффект мульти-кошки» наложив несколько <img> друг на друга.

Если ответить по простому — потому что на рисунке можно будет использовать еще и текст. Если же более развернуто — то холст дает возможность комбинировать различные графические элементы. Вспомни наш холст с изображением системы координат: он включал в себя текст, линии, фигуры — тут текст был небольшой частью большой работы. Более сложные диаграммы с помощью drawImage() могут включать иконки, спрайты и другие графические элементы.

Куда дальше

Показать комментарии