Как увеличить Picturebox с помощью scrollwheel в vb.net

Я использую набор графических наложений для рисования изображения внутри элемента управления picturebox с помощью графического объекта. Я поместил Picturebox внутри панели и установил панель на автопрокрутку. Что мне нужно знать, как сделать сейчас, это использовать колесо прокрутки мыши, чтобы взорвать размер изображения с небольшим шагом, сохраняя при этом качество изображения. Кто-нибудь знает, как это сделать?

когда я обновляю с программным кодом Abdias ниже, изображение начинается меньше, когда Свойство Sizemode picturebox имеет значение StretchImage. У меня есть функция панорамирования с помощью мыши, которая может препятствовать правильной работе этого кода. Есть Идеи? Что могло помешать этому работать должным образом?

решить

этот код работал намного лучше для меня, чем любой из двух ниже:

Private Sub PictureBox_MouseWheel(sender As System.Object,
                             e As MouseEventArgs) Handles PictureBox1.MouseWheel
    If e.Delta <> 0 Then
        If e.Delta <= 0 Then
            If PictureBox1.Width < 500 Then Exit Sub 'minimum 500?
        Else
            If PictureBox1.Width > 2000 Then Exit Sub 'maximum 2000?
        End If

        PictureBox1.Width += CInt(PictureBox1.Width * e.Delta / 1000)
        PictureBox1.Height += CInt(PictureBox1.Height * e.Delta / 1000)
    End If

End Sub

3 ответов


вы можете попробовать этот код. Он предполагает, что существует Panel1 и PictureBox1 в форме (PictureBox1 внутри Panel1 С Panel1.AutoScroll = True) с изображением расположенного на PictureBox.

код не вычисляет центральную точку масштабирования, но вы можете использовать e.Местоположение (или e.X / e.Y) за это.

Update-вот новый код, который (должен быть) более надежным, чем предыдущий (см. Внизу):

Public Class Form1

    Private _originalSize As Size = Nothing
    Private _scale As Single = 1
    Private _scaleDelta As Single = 0.0005

    Private Sub Form_MouseWheel(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

        'if very sensitive mouse, change 0.00005 to something even smaller   
        _scaleDelta = Math.Sqrt(PictureBox1.Width * PictureBox1.Height) * 0.00005

        If e.Delta < 0 Then
            _scale -= _scaleDelta
        ElseIf e.Delta > 0 Then
            _scale += _scaleDelta
        End If

        If e.Delta <> 0 Then _
        PictureBox1.Size = New Size(CInt(Math.Round(_originalSize.Width * _scale)), _
                                    CInt(Math.Round(_originalSize.Height * _scale)))

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

        'init this from here or a method depending on your needs
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Size = Panel1.Size
            _originalSize = Panel1.Size
        End If

    End Sub

End Class

старый код-работает, но нестабилен при больших изменениях, вероятно, из-за к ошибкам округления в масштабе ():

Public Class Form1

    Private _scale As New SizeF(1, 1)
    Private _scaleDelta As New SizeF(0.01, 0.01) '1% for each wheel tick

    Private Sub Form_MouseWheel(sender As System.Object, 
                                e As MouseEventArgs) Handles Me.MouseWheel
'count incrementally 
        _scale.Height = 1
        _scale.Width = 1

        If e.Delta < 0 Then
            _scale += _scaleDelta
        ElseIf e.Delta > 0 Then
            _scale -= _scaleDelta
        End If

        If e.Delta <> 0 Then _
        PictureBox1.Scale(_scale)

    End Sub

    Private Sub Form1_Load(sender As System.Object, 
                           e As EventArgs) Handles MyBase.Load

        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

        'init picturebox size = image size
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Scale(New SizeF(1, 1))
            PictureBox1.Size = PictureBox1.Image.Size
        End If

    End Sub

End Class

в основном, вам нужен для просмотра изображений. Я использовал это раньше: http://cyotek.com/blog/creating-a-scrollable-and-zoomable-image-viewer-in-csharp-part-4

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

для picturebox вам нужно создать графику из изображения, а затем интерполировать ее. вот пример: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196

Я не проверял, но похоже будет работа.


я заметил, что есть нежелательный эффект с StretchImage SizeMode это игнорирует соотношение изображений. Я просто добавил переменную отношения ширины и высоты для включения в алгоритм "масштабирования". См._ratWidth и _ratHeight в коде ниже.

Public Class Form1

Private _originalSize As Size = Nothing
Private _scale As Single = 1
Private _scaleDelta As Single = 0.0005
Private _ratWidth, _ratHeight As Double

Private Sub Form_MouseWheel(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

    'if very sensitive mouse, change 0.00005 to something even smaller   
    _scaleDelta = Math.Sqrt(PictureBox1.Width * PictureBox1.Height) * 0.00005

    If e.Delta < 0 Then
        _scale -= _scaleDelta
    ElseIf e.Delta > 0 Then
        _scale += _scaleDelta
    End If

    If e.Delta <> 0 Then _
    PictureBox1.Size = New Size(CInt(Math.Round((_originalSize.Width * _ratWidth) * _scale)), _
                                CInt(Math.Round((_originalSize.Height * _ratHeight) * _scale)))

End Sub

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

    'init this from here or a method depending on your needs
    If PictureBox1.Image IsNot Nothing Then
        _ratWidth = PictureBox1.Image.Width / PictureBox1.Image.Height
        _ratHeight = PirctureBox1.Image.Height / PictureBox1.Image.Width
        PictureBox1.Size = Panel1.Size
        _originalSize = Panel1.Size
    End If
End Sub
End Class