PictureBoxSizeMode.Zoom - Какой коэффициент увеличения? - PullRequest
1 голос
/ 07 января 2009

У меня есть PictureBox (его свойство SizeMode установлено в Zoom), содержащее изображение, и оба могут различаться по размеру.

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

То, что я сделал до сих пор, это сравните соотношение сторон PictureBox и соотношение сторон изображения. Например, если PictureBox «более широкоэкранный» по отношению к изображению (см. Скриншот), это означает, что PictureBox растянет изображение до его собственной высоты и отцентрирует его по горизонтали, показывая его цвет фона (в данном случае красный) к слева и справа от изображения. Затем я предполагаю, что отображаемая высота изображения такая же, как PictureBox.Height, и работаю оттуда.

Хотя есть проблема. Как вы можете видеть на скриншоте (зеленая пометка), белое изображение растягивается, чтобы поместиться (увеличено) внутри красного PictureBox, оставляя небольшое поле внизу.

screenie http://img132.imageshack.us/img132/3541/bordernl6.th.png Нажмите для увеличения.

Однако это происходит не для всех комбинаций PictureBox.Size / Image.Size. Это заставляет меня верить, что должен быть лучший способ сделать это.


Конечно, я сделаю это. Мне просто нужно адаптировать код для удаления зависимости контекста.

Но поле внизу не исходит из моего кода. Это происходит от самого PictureBox. Сделайте мне одолжение и попробуйте следующее:

Добавьте PictureBox (PictureBox1) в форму, закрепите его на всех четырех сторонах формы. Код должен выглядеть следующим образом:

Public Class Form1

    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown

        PictureBox1.SizeMode = PictureBoxSizeMode.Zoom

        PictureBox1.BackColor = Color.Red
        PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)

        g.FillRectangle(Brushes.White, 0, 0, PictureBox1.Image.Width, PictureBox1.Image.Height)

    End Sub

End Class

Запустите его и измените размер формы так, чтобы изображение растягивалось (увеличивалось), чтобы заполнить высоту PictureBox, оставляя красные полосы слева и справа от белого квадрата. Теперь измените размер формы вертикально, как можно медленнее. Время от времени вы должны видеть красное поле внизу.

То же самое происходит с шириной и горизонтальным изменением размера, показывая поле справа.

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

Спасибо, что нашли время, чтобы прочитать и ответить.

1 Ответ

0 голосов
/ 08 января 2009

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

Не могли бы вы опубликовать полный пример, показывающий вычисления, которые вы выполняете?

...