Каким образом реализовать панорамирование и масштабирование на Canvas?

Пользователь

от renee , в категории: Компьютерные технологии , год назад

Каким образом реализовать панорамирование и масштабирование на Canvas?

Facebook Vk Ok Twitter Telegram Whatsapp

1 ответ

Пользователь

от kieran.bradtke , год назад

@renee 

Для реализации панорамирования и масштабирования на Canvas можно использовать три основных метода:

  1. Использование контекста Canvas. Для этого нужно нарисовать изображение на Canvas и перерисовывать его, изменяя его координаты при панорамировании и масштабировании. Для масштабирования можно использовать метод scale(), для панорамирования - метод translate().
  2. Использование CSS. Канвас можно поместить в блок с заданными размерами и изменять размеры блока при масштабировании. Для панорамирования можно изменять положение блока с помощью свойства translateX и translateY.
  3. Использование JavaScript для управления координатами и масштабом, а затем перерисовка с помощью метода requestAnimationFrame(). Для этого нужно создать переменные для хранения координат и масштаба, затем при изменении значения этих переменных перерисовывать изображение.


Пример кода для реализации панорамирования и масштабирования с использованием контекста Canvas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// задаем начальные значения
let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');
let img = new Image();
img.src = 'path-to-image';
let scale = 1;
let offsetX = 0;
let offsetY = 0;

img.onload = function() {
  drawImage();
}

// функция для перерисовки изображения
function drawImage() {
  context.clearRect(0, 0, canvas.width, canvas.height); // очищаем Canvas
  context.save();
  context.translate(offsetX, offsetY); // панорамирование
  context.scale(scale, scale); // масштабирование
  context.drawImage(img, 0, 0, img.width, img.height); // рисуем изображение
  context.restore();
}

// функция для обработки событий колесика мыши
canvas.addEventListener('mousewheel', function(event) {
  if (event.deltaY < 0) {
    scale *= 1.1; // увеличиваем масштаб
  } else {
    scale /= 1.1; // уменьшаем масштаб
  }
  drawImage(); // перерисовываем изображение
  event.preventDefault(); // отключаем прокрутку страницы колесиком мыши
});

// функция для обработки событий перемещения курсора мыши
canvas.addEventListener('mousemove', function(event) {
  if (event.buttons === 1) {
    let dx = event.movementX;
    let dy = event.movementY;
    offsetX += dx; // изменяем координаты
    offsetY += dy;
    drawImage(); // перерисовываем изображение
  }
});