有没有一种方法可以将像素坐标转换为VB.net中的笛卡尔坐标

时间:2019-01-08 14:52:14

标签: vb.net pixel

我有一个PictureBox,其大小为1096 x 1004,并且SizeMode设置为StretchImage。通过考虑像素坐标上的StrechImage效果,我能够正确获取每个像素的坐标(请参见下面的代码)。

现在我要完成的工作是将这些像素坐标转换为笛卡尔坐标以能够绘制图形。从长远来看,我将采用笛卡尔坐标并将其转换为极坐标。

我试图通过这种方法将像素坐标转换为笛卡尔坐标。

cartesianx = scalefactor*screenx - screenwidth / 2;
cartesiany = -scalefactor*screeny + screenheight / 2;

此方法未将原点放在PictureBox中心的(0,0)处。似乎将原点设置为更靠近PictureBox的左上方。关于我所缺少的东西有什么主意吗?

下面是我的代码,用于将图像转换为BitMap并获取这些坐标并正确缩放它们。

Imports System.IO

Public Class HomePanel

Dim realX As Int32
Dim realY As Int32

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

    chartImageDisplay_box.Image = Image.FromFile("C:\Users\UserB\Desktop\test.jpg")

End Sub


Private Sub chartImageDisplay_box_MouseMove(sender As Object, e As MouseEventArgs) Handles chartImageDisplay_box.MouseMove

    If (e.Button = MouseButtons.Left) Then
        ShowCoords(e.X, e.Y)
    End If

End Sub



Private Sub chartImageDisplay_box_MouseDown(sender As Object, e As MouseEventArgs) Handles chartImageDisplay_box.MouseDown
    If (e.Button = MouseButtons.Left) Then
        ShowCoords(e.X, e.Y)

        Dim MyBitmap As Bitmap
        MyBitmap = CType(chartImageDisplay_box.Image, Bitmap)
        'Me.BackColor = MyBitmap.GetPixel(realX, realY)
        rgbValue.Text = "RGB Value: " & MyBitmap.GetPixel(realX, realY).ToString()

    End If
    'printAllPixels()

End Sub


Private Sub ShowCoords(ByVal mouseX As Int32, ByVal mouseY As Int32)
    Dim realW As Int32 = chartImageDisplay_box.Image.Width
    Dim realH As Int32 = chartImageDisplay_box.Image.Height
    Dim currentW As Int32 = chartImageDisplay_box.ClientRectangle.Width
    Dim currentH As Int32 = chartImageDisplay_box.ClientRectangle.Height
    Dim zoomW As Double = (currentW / CType(realW, Double))
    Dim zoomH As Double = (currentH / CType(realH, Double))
    Dim zoomActual As Double = Math.Min(zoomW, zoomH)
    Dim padX As Double = If(zoomActual = zoomW, 0, (currentW - (zoomActual * realW)) / 2)
    Dim padY As Double = If(zoomActual = zoomH, 0, (currentH - (zoomActual * realH)) / 2)
    realX = CType(((mouseX - padX) / zoomActual), Int32)
    realY = CType(((mouseY - padY) / zoomActual), Int32)
    lblPosXval.Text = "X: " & If(realX < 0 OrElse realX > realW, "-", realX.ToString())
    lblPosYVal.Text = "Y: " & If(realY < 0 OrElse realY > realH, "-", realY.ToString())
    cartX.Text = "X: " 'Where to add the cart conversion for X
    cartY.Text = "Y: " 'Where to add the cart conversion for Y

End Sub


'Writes all the pixels to a text file along with RGB values for each pixel
Public Sub printAllPixels()
    Using writer As StreamWriter =
        New StreamWriter("C:\Users\UserB\Desktop\Pixels.txt")

        Dim MyBitmap As Bitmap
        MyBitmap = CType(chartImageDisplay_box.Image, Bitmap)


        For y = 0 To MyBitmap.Height - 1
            For x = 0 To MyBitmap.Width - 1
                writer.WriteLine("XY Coord: " & x & ", " & y & ";   " & MyBitmap.GetPixel(x, y).ToString)
            Next
        Next


    End Using
End Sub
End Class

2 个答案:

答案 0 :(得分:1)

我不知道变量的内容是否包含正确的值,但公式应更像这样:

cartesianx = scalefactor * (screenx - (screenwidth / 2))
cartesiany = -scalefactor* (screeny - (screenheight / 2))

转换为0,0添加比例因子,然后翻转y。

答案 1 :(得分:0)

我相信我已经解决了我的问题。我为screenx和screeny使用了错误的值。我使用的是计算得出的比例值,但是我只需要使用鼠标事件的X和Y值。