2015-05-02 5 views
8

Я пишу сценарий с Fabric.js для увеличения изображения в текущей позиции мыши. Я сделал некоторый прогресс, но где-то есть ошибка.Изображение сфокусировано по положению мыши

Дело 1: Держите мышь в одной точке и увеличивайте с помощью колеса мыши.

Результат: Работает отлично, масштабирование изображения в этом конкретном пикселе.

Корпус 2: Увеличьте немного места в одном положении (3-5 раз с помощью колеса мыши), затем переместите мышь в новое положение и увеличьте масштаб.

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

Мой код находится в этой скрипкой:

https://jsfiddle.net/gauravsoni/y3w0yx2m/1/

Я подозреваю, что что-то не так с логикой позиционирования изображения:

imgInstance.set({top:imgInstance.getTop()-newMousY,left:imgInstance.getLeft()-newMousX}); 

Что происходит не так?

+0

Почему бы не использовать функцию масштабирования и панорамирования холста? или вам нужно масштабировать только объект изображения и ничего больше? Проверьте это: http: // fabricjs.com/kitchensink/# zoom (используйте прокрутку для увеличения) Использование масштабирования холста позволит вам увеличить масштаб объекта на холсте при необходимости без выполнения вычислений. Я могу сделать скрипку, если вы захотите изучить эту возможность. – AndreaBogazzi

+0

@AndreaBogazzi Мне нужно увеличить в том конкретном положении, где находится мышь, функция масштабирования холста просто масштабирует изображение. –

+0

Да, я говорю о панораме FABRICJS для точечной и масштабируемой функции. Не холст. Я вижу, что для этого вы используете fabricjs. – AndreaBogazzi

ответ

19

Ключом к решению этой головоломки является понимание того, как изображение увеличивается. Если мы используем коэффициент масштабирования 1,2, изображение становится на 20% больше. Зададим 1.2 переменной factor и сделайте следующее:

image.setScaleX(image.getScaleX() * factor); 
image.setScaleY(image.getScaleY() * factor); 

Верхний левый угол изображения остается в том же месте, в то время как изображение увеличивается. Теперь рассмотрим точку под курсором мыши. Каждый пиксель выше и слева от курсора становится на 20% больше. Это смещает точку под курсором на 20% вниз и вправо. Между тем, курсор находится в том же положении.

Чтобы компенсировать смещение точки под курсором, мы перемещаем изображение так, чтобы точка возвращалась под курсором. Точка двинулась вниз и вправо; мы перемещаем изображение вверх и оставляем на том же расстоянии.

Обратите внимание, что изображение могло быть перемещено в холсте перед операцией масштабирования, поэтому горизонтальное положение курсора на изображении равно currentMouseX - image.getLeft() перед масштабированием, а также для вертикальной позиции.

Это, как мы вычислить смещение после масштабирования:

var dx = (currentMouseX - image.getLeft()) * (factor - 1), 
    dy = (currentMouseY - image.getTop()) * (factor - 1); 

Наконец, мы компенсировать смещение, перемещая точку назад под курсором:

image.setLeft(image.getLeft() - dx); 
image.setTop(image.getTop() - dy); 

Я интегрирован этот расчет в ваш демонстрационной версии и сделал следующую скрипту:

https://jsfiddle.net/sbpag9fr/3/

Я также выполнил операцию уменьшения.

+1

Спасибо большое! я застрял в течение 2 дней на этом. может присудить награду за 8 часов –

+0

Может ли кто-нибудь реализовать одно и то же использование холста? без какой-либо библиотеки? –

Смежные вопросы