【问题标题】:How can I get the RGB color of the pixel at the cursor location using VB.NET?如何使用 VB.NET 获取光标位置像素的 RGB 颜色?
【发布时间】:2017-01-11 21:19:14
【问题描述】:

如何获取光标所在位置像素的颜色?我知道如何使用 MousePosition 获取鼠标位置,但我不知道如何获取该位置的像素颜色。

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    C# 版本:How do I get the colour of a pixel at X,Y using c# ?
    应该很容易在 VB.NET 中重写。

    【讨论】:

    【解决方案2】:

    快速简单非常慢,但它的工作原理。

    想法是将屏幕复制到位图,这可以使用 GDI+ 构建到 drawing.graphics 对象中来完成。然后只需读取它生成的位图。获取像素非常慢。直接读取图像字节数组的最佳方式。

    Function MakeScreenShot() As Drawing.Bitmap
        Dim out As Drawing.Bitmap
    
        'Get the screen Size
        Dim bounds As Rectangle = Screen.GetBounds(Point.Empty)
    
        'create the bitmap
        out = New Drawing.Bitmap(bounds.Width, bounds.Height)
    
        'create a graphic object to recive the pic
        Using gr As Drawing.Graphics = Graphics.FromImage(out)
            'Copy the screen using built in API
            gr.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size)
        End Using
    
        Return out
    End Function
    
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Dim BM As Drawing.Bitmap = MakeScreenShot()
        Dim mouseloc As Point = Cursor.Position
        Dim c As Color = BM.GetPixel(mouseloc.X, mouseloc.Y) ' The Slowest way possable to read a color
    
        Debug.Print(c.R & "," & c.G & "," & c.B)
    End Sub
    

    享受吧。

    【讨论】:

      【解决方案3】:

      试试这个代码:

      #Region "#include"
      Imports System
      Imports System.Drawing
      Imports System.Runtime.InteropServices
      #End Region
      Public Class Test
      
      #Region "From Windows API"
          <DllImport("user32.dll", SetLastError:=True)> _
          Public Shared Function GetWindowDC(ByVal hwnd As IntPtr) As IntPtr
              'Do not try to name this method "GetDC" it will say that user32 doesnt have GetDC !!!
          End Function
      
          <DllImport("user32.dll", SetLastError:=True)> _
          Public Shared Function ReleaseDC(ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Int32
      
          End Function
      
          <DllImport("gdi32.dll", SetLastError:=True)> _
          Public Shared Function GetPixel(ByVal hdc As IntPtr, ByVal nXPos As Integer, ByVal nYPos As Integer) As UInteger
      
          End Function
      #End Region
          REM --Test--
      #Region "Some Functions"
          Public Function GetPixelColor(ByVal x As Integer, ByVal y As Integer) As Color
              Dim hdc As IntPtr = GetWindowDC(IntPtr.Zero)
              Dim pixel As UInteger = GetPixel(hdc, x, y)
              Dim color As Color
              ReleaseDC(IntPtr.Zero, hdc)
              MsgBox(pixel)
              color = color.FromArgb(Int(pixel And &HFF), _
              Int(pixel And &HFF00) >> 8, _
              Int(pixel And &HFF0000) >> 16)
              Return color
          End Function
      #End Region
          REM --Test--
      #Region "OnClick"
          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
              Dim mouseloc As Point = Cursor.Position
              Me.Label1.BackColor = GetPixelColor(mouseloc.X, mouseloc.Y)
              Me.Refresh()
          End Sub
      #End Region
      End Class
      

      您需要按钮 (name==Button1) 和标签 (name==Label1)。要从屏幕获取颜色,您需要使用 Timer。

      如果您需要将代码从 C# 重写为 VB.NET,请使用此链接:http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

      【讨论】:

        【解决方案4】:

        保持简单,不是很优化,但可以完成工作:

            Public Class Form1
            Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        
            Declare Function GetDC Lib "user32" (ByVal hWnd As IntPtr) As IntPtr
            Declare Function ReleaseDC Lib "user32" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As IntPtr
        
            Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32
        
            Private Function CheckScreen()
                Dim CursorLoc As Point = Cursor.Position
                Dim hDC As IntPtr = GetDC(0) '0 = Get the color to any window on screen, not only your app
                Try
                    Dim CursorColor As Integer = GetPixel(hDC, CursorLoc.X, CursorLoc.Y)
                    Me.Panel1.BackColor = ColorTranslator.FromWin32(CursorColor) 'a simple panel to show the color
                    Me.Refresh()
                    Return True
                Catch ex As Exception
                    Return False
                Finally
                    ReleaseDC(0, hDC)
                End Try
        
            End Function
        
            Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
                Me.Timer1.Start() 'Timer with a short delay 
            End Sub
        
            Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
                CheckScreen()
            End Sub
        End Class
        

        【讨论】:

          【解决方案5】:

          这实际上比你想象的要难。我会寻找一些已经这样做的示例代码,并复制他们的技术。

          最后,算法将不得不执行这些操作:

          1. 获取靠近光标位置的桌面/窗口的位图
          2. 使用光标位置索引该位图并提取像素颜色

          听起来很简单,但并不容易。

          【讨论】:

          • 这就是我所看到的,但我能找到的唯一示例代码是 C++ 的,我大部分都不懂。
          猜你喜欢
          • 2021-08-05
          • 1970-01-01
          • 1970-01-01
          • 2020-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-22
          • 1970-01-01
          相关资源
          最近更新 更多