Как увеличить 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