awilum.ru
Статьи Курсы Об авторе

Рисование изображений в Canvas

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

Прежде чем отобразить изображение на холсте, необходимо загрузить его с помощью объекта Image JavaScript.

const img = new Image();

// Указываем путь к изображению
img.src = 'https://ik.imagekit.io/awilum/welcome-to-hawkins.jpg?updatedAt=1702540829891';

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

// Отображаем изображение на холсте в координатах (x, y)
ctx.drawImage(img, x, y);

Метод drawImage() имеет несколько вариантов использования, позволяющих управлять размерами и масштабированием изображения.

Синтакcис:

drawImage(img, dx, dy);
drawImage(img, dx, dy, dWidth, dHeight);
drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

Параметры:

img Элемент для отображения в контексте.
dx Координата по оси Х, обозначающая стартовую точку холста-приёмника,
в которую будет помещён верхний левый угол исходного image.
dy Координата по оси Y, обозначающая стартовую точку холста-приёмника,
в которую будет помещён верхний левый угол исходного image.
dWidth Ширина изображения, полученного из исходного image.
Эта опция позволяет масштабировать изображение по ширине.
Если опция не задана, изображение не будет масштабировано.
dHeight Высота изображения, полученного из исходного image.
Эта опция позволяет масштабировать изображение по высоте.
Если опция не задана, изображение не будет масштабировано.
sx Координата по оси X верхнего левого угла фрагмента,
который будет вырезан из изображения-источника и помещён в контекст-приёмник.
sy Координата по оси Y верхнего левого угла фрагмента,
который будет вырезан из изображения-источника и помещён в контекст-приёмник.
sWidth

Ширина фрагмента, который будет вырезан из изображения источника
и помещён в контекст-приёмник. Если не задана, фрагмент от точки,
заданной sx и sy до правого нижнего угла источника будет целиком
скопирован в контекст-приёмник.

sHeight Высота фрагмента, который будет вырезан из изображения источника и помещён в контекст-приёмник.

Отображение изображения в его естественном размере:

ctx.drawImage(img, 0, 0);

Результат:

Масштабирование изображения до определенной ширины и высоты:

// Изображение будет масштабировано до размеров 100x100 пикселей
ctx.drawImage(img, 0, 0, 100, 100);

Результат:

Масштабирование изображения до размеров холста:

ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);

Результат:

Использование метода onLoad()

Метод onload объекта Image является обработчиком события, который вызывается, когда изображение загружено. Это очень важный момент при работе с изображениями в веб-разработке, потому что до момента загрузки изображения вы не можете гарантировать, что оно доступно для отображения или манипуляций.

Создаем новый объект Image и устанавливаем его src на путь к изображению. На этом этапе происходит начало загрузки изображения.

const img = new Image();
img.src = 'https://ik.imagekit.io/awilum/welcome-to-hawkins.jpg?updatedAt=1702540829891';

После того как изображение полностью загружено, событие onload срабатывает, и код внутри обработчика выполняется.

img.onload = function() {
    // В этом блоке кода можно выполнять действия с изображением,
    // которые должны произойти после его загрузки.

   ctx.drawImage(img, 0, 0);
   console.log('Изображение загружено!');
};

Зачем это нужно?

Cтатьи про Canvas

Хотите освоить JavaScript и стать востребованным разработчиком?
Присоединяйтесь к курсу JavaScript Базовый уровень прямо сейчас!
Изучите основы и продвинутые концепции, создавайте интерактивные веб-приложения и воплотите свои идеи в реальности. Не упустите шанс стать экспертом в мире разработки – начните свой путь прямо сейчас!
Обнаружили ошибку в этой статье? Хотите уточнить, обновить или добавить что-то?
Все мои статьи доступны для редактирования на GitHub. Буду благодарен за любое улучшение или исправление!