Вопрос по c#, visual-studio – Масштабирование / растяжение изображения в текущей позиции мыши?

3

Q: How can I implement zooming on current mouse position over a picturebox, something like zooming in Google Maps?

В качестве дипломной работы я создаю простой движок ГИС / карт. Приложение разработано таким образом, что карты загружаются во вкладки слегка измененного tabcontrol.

Карты представляют собой цифровые изображения в стандартном формате JPEG или PNG, и большинство из них имеют очень высокое разрешение (2000x2000 пикселей и выше).

Они загружаются в графические окна, которые добавляются в качестве элементов управления вкладками. Я реализовал простой метод масштабирования в качестве события нажатия кнопки, которое только увеличивает центр изображения / изображения.

То, что я хотел бы сделать, это реализовать масштабирование события mousewheel таким образом, чтобы изображение масштабировалось на текущую позицию мыши внутри поля picturebox.

Код для увеличения в настоящее время выглядит следующим образом:

            timesZoomed += 1;
            zoomRatio += 0.1f;
            pbxMapa.Width = pbxMapa.Width * zoomRatio;
            pbxMapa.Height = pbxMapa.Height * zoomRatio;
            pbxMapa.Location = new Point((this.Width / 2) - (pbxMapa.Width / 2), this.Height / 2) - (pbxMapa.Height / 2));
The default "zoomRatio" value is 1, and it is being increased up to 0.6f. Argument "timesZoomed" default value is 0, it goes up to 6. "pbxMapa" is the picturebox with the loaded image of the map. "ImageSizeMode" prop of the picturebox is set to "Zoom", but the size of the picturebox is set to the full size of the loaded map image.

Кроме того, я экспериментировал с этим простым кодом масштабирования. Расчет несколько эффективен, но при увеличении / увеличении он все же имеет большое смещение:

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
"mouseXPbx" and "mouseYPbx" variables represent the current mouse position inside of the "pbxMapa". I divided by 8 for minimizing the offset in the positioning.

Любая помощь и предложения приветствуются, спасибо заранее.

А что не так с вашим кодом? Извините, не могу понять, в чем проблема. Вы пытались прочитать какие-либо статьи?Here's one interesting Reniuz
В моем коде нет ничего плохого, он приближается к центру, как и предполагалось. Мне нужна помощь со вторым примером кода, он не масштабируется так, как должен ... есть некоторое смещение, когда я пытаюсь увеличить масштаб до текущей позиции мыши. Спасибо за статью, кстати. Filip Filipović
Вы перемещаете элемент управления, чтобы изменить относительное положение мыши. Это просто неправильный способ сделать это, вместо этого нарисуйте карту в событии Paint с помощью e.Graphics.DrawImage. И используйте e.Graphics.TranslateTransform и ScaleTransform для перемещения и масштабирования изображения. Hans Passant
Какой у Вас вопрос? : / Reniuz
Как я могу увеличить или растянуть изображение в поле мыши? Что-то вроде увеличения на картах Google? Filip Filipović

Ваш Ответ

2   ответа
0

Мне удалось настроить расчет местоположения в этой строке кода. Работает нормально, это увеличение, как мне нужно.

pbxMapa.Location = new Point(pbxMapa.Location.X + (int)(((pbxMapa.Location.X - mouseXPbx) / 10) * zoomRatio), pbxMapa.Location.Y + (int)(((pbxMapa.Location.Y - mouseYPbx) / 10) * zoomRatio));
4

код ниже увеличил и растянул pictureBox в текущей позиции мыши

pictureBox1.Width = (int)(pictureBox1.Width * zoomratio );
pictureBox1.Height = (int)(pictureBox1.Height * zoomratio );                
pictureBox1.Top = (int)(e.Y - zoomratio * (e.Y - pictureBox1.Top));
pictureBox1.Left = (int)(e.X - zoomratio * (e.X - pictureBox1.Left));
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededzoomratioError: User Rate Limit Exceeded
Error: User Rate Limit ExceededzoomratioError: User Rate Limit Exceeded

Похожие вопросы