larry118 Ответов: 1

Нужно получить информацию о пикселях и прокрутить изображение с помощью 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

Вы должны разместить свой вопрос в статье или решении, чтобы человек, написавший код, мог вам помочь.

1 Ответов

Рейтинг:
12

OriginalGriff

The problem is that when you zoom an image, you don't affect the underlying Bitmap - you just cause the Paint event to "compress" or "expand" the image before drawing it on the user's screen - which means that the "pixel under the cursor" has no direct relationship with the original image, as it might (for example) be a blend of 9 different image pixels in the original shown as one pixel on the screen if the user is zoomed out. You can get the actual screen pixel value, but it's a little complicated as you need to PInvoke teh system, there is no direct method of accessing the screen other than the spectacularly inefficient "grab a screen bitmap and look at it" approach. See here: api - как получить цвет пикселя в точках X,Y с помощью c#? - переполнение стека[^] и удачи вам в переводе его на VB!