Нужно получить информацию о пикселях и прокрутить изображение с помощью VB .NET
Привет,
Некоторое время назад я нашел этот аккуратный маленький пример прокрутки обычного picturebox в vb .net. Я приношу свои извинения, потому что не могу дать кредит там, где он должен быть, но он отлично работает для масштабирования, за исключением одной маленькой проблемы, на самом деле двух.
Мне нужно показать некоторую информацию, наведя курсор мыши на изображение, например значения rgb. Другой-иметь возможность увеличивать и изменять значение пикселя, как программа рисования.
В этом примере у меня есть событие наведения курсора мыши в picturebox, которое довольно хорошо работает для отображения значения rgb до того, как изображение будет увеличено или уменьшено. Как только picturebox меняет размер, rgb перестает быть точным и вообще не работает, когда находится за пределами исходных границ изображения.
Я могу изменить размер изображения, но масштабирование колесика мыши работает так хорошо, что мне было интересно, может ли кто-нибудь помочь мне заставить мышь над событием работать, когда изображение масштабируется или панорамируется. В качестве примера я привел простой проект.
Еще раз приношу свои извинения тому, кто разместил это решение, оно отлично работает по своему первоначальному назначению.
Ларри
Что я уже пробовал:
- Получение координат экрана и сопоставление их с изображением. Вот этот код:
Imports System.ComponentModel Public Class Form1 Private ZOOMFACTOR As Double = 1.25 ' = 25% smaller or larger Private MINMAX As Integer = 5 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' PicBox ' Me.PicBox.Location = New System.Drawing.Point(120, 120) Me.PicBox.Name = "PicBox" Me.PicBox.Size = New System.Drawing.Size(PicBox.Image.Width / 3, PicBox.Image.Height / 3) Me.PicBox.TabIndex = 3 Me.PicBox.TabStop = False ' ' OuterPanel ' Me.OuterPanel.AutoScroll = True Me.OuterPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle OuterPanel.Cursor = System.Windows.Forms.Cursors.NoMove2D AddHandler OuterPanel.MouseEnter, AddressOf Me.PicBox_MouseEnter AddHandler PicBox.MouseEnter, AddressOf Me.PicBox_MouseEnter AddHandler OuterPanel.MouseWheel, AddressOf Me.PicBox_MouseWheel ' Me.OuterPanel.Controls.Add(Me.PicBox) ' Me.OuterPanel.Dock = System.Windows.Forms.DockStyle.Fill ' Me.OuterPanel.Location = New System.Drawing.Point(0, 0) ' Me.OuterPanel.Name = "OuterPanel" Me.OuterPanel.Size = New System.Drawing.Size(210, 190) Me.OuterPanel.TabIndex = 4 ' ' PictureBox ' ' Me.Controls.Add(Me.OuterPanel) Me.Name = "PictureBox" Me.Size = New System.Drawing.Size(1000, 1000) Me.OuterPanel.ResumeLayout(False) Me.ResumeLayout(False) End Sub Private Sub PicBox_MouseWheel(sender As Object, e As MouseEventArgs) Handles PicBox.MouseWheel If (e.Delta < 0) Then Me.ZoomIn() Else Me.ZoomOut() End If End Sub Private Sub PicBox_MouseEnter(sender As Object, e As EventArgs) Handles PicBox.MouseEnter If (Me.PicBox.Focused = False) Then Me.PicBox.Focus() End If End Sub Private Sub ZoomIn() If ((Me.PicBox.Width _ < (Me.MINMAX * Me.OuterPanel.Width)) _ AndAlso (Me.PicBox.Height _ < (Me.MINMAX * Me.OuterPanel.Height))) Then Me.PicBox.Width = Convert.ToInt32((Me.PicBox.Width * Me.ZOOMFACTOR)) Me.PicBox.Height = Convert.ToInt32((Me.PicBox.Height * Me.ZOOMFACTOR)) Me.PicBox.SizeMode = PictureBoxSizeMode.StretchImage End If End Sub ''' <summary> ''' Make the PictureBox dimensions smaller to effect the Zoom. ''' </summary> ''' <remarks>Minimum 5 times smaller</remarks> Private Sub ZoomOut() If ((Me.PicBox.Width _ > (Me.OuterPanel.Width / Me.MINMAX)) _ AndAlso (Me.PicBox.Height _ > (Me.OuterPanel.Height / Me.MINMAX))) Then Me.PicBox.SizeMode = PictureBoxSizeMode.StretchImage Me.PicBox.Width = Convert.ToInt32((Me.PicBox.Width / Me.ZOOMFACTOR)) Me.PicBox.Height = Convert.ToInt32((Me.PicBox.Height / Me.ZOOMFACTOR)) End If End Sub Private Sub PicBox_MouseMove(sender As Object, e As MouseEventArgs) Handles PicBox.MouseMove If PicBox.Image Is Nothing Then Exit Sub End If Dim bmpRGB As Bitmap = PicBox.Image Try Cursor.Current = Cursors.Hand 'If e.X > (bmpRGB.Width * CInt(lblZoom.Text) - 1) Or e.Y > (bmpRGB.Height * CInt(lblZoom.Text) - 1) Then Exit Sub Dim color = bmpRGB.GetPixel(e.X, e.Y) lblColor.Text = "R=: " + color.R.ToString + " G=: " + color.G.ToString + " B=: " + color.B.ToString Cursor.Current = Cursors.Default Catch Cursor.Current = Cursors.Default Finally ' bmpRGB.Dispose() Cursor.Current = Cursors.Default End Try End Sub End Class
Richard MacCutchan
Вы должны разместить свой вопрос в статье или решении, чтобы человек, написавший код, мог вам помочь.