Recorrer la pantalla píxel por píxel
Publicado por ebi (7 intervenciones) el 11/05/2009 18:50:23
Hola,
estoy recorriendo la pantalla para encontrar la localización de un objeto ajeno a mi aplicación. Voy píxel por píxel, buscando el color que yo quiero, rgb(240,240,224).
Lo que pasa es que es muy lento. He puesto "for i = 1 to 1280" y luego "for j = 1 to 1024", los dos con "step 50", y tarda 11 segundos, y tiene el problema de saltárse lo que busco.
Si pongo "step 1" supongo que tardará 2500 veces más (7 horas), lo cual es, lógicamente, inviable. Pero el procesador ni se inmuta, por lo que no sé dónde está el gasto de tiempo.
¿Hay otra forma de recorrer la pantalla en menos tiempo?
El código, de momento, es este:
<code>
Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
Private Declare Function GetWindowDC Lib "user32.dll" (ByVal hwnd As Integer) As Integer
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Integer
Dim Kol As Color
Dim Xpix As Integer
Dim Ypix As Integer
Public Function PixelColor(ByVal x As Integer, ByVal y As Integer) As Color
Dim winDc = GetWindowDC(GetDesktopWindow)
Dim color = GetPixel(winDc, x, y).ToString
PixelColor = System.Drawing.ColorTranslator.FromOle(color)
End Function
Public Sub JMScan()
Dim I As Integer
Dim J As Integer
For I = 1 To 1280 Step 50
For J = 1 To 1024 Step 50
Kol = PixelColor(I, J)
If (Kol.R = 240) And (Kol.G = 240) And (Kol.B = 224) Then
MsgBox(I & " x " & J) ' <-- aquí luego pondré otras cosas
End If
Application.DoEvents()
Next J
Next I
MsgBox("Escaneo Terminado")
End Sub
</code>
estoy recorriendo la pantalla para encontrar la localización de un objeto ajeno a mi aplicación. Voy píxel por píxel, buscando el color que yo quiero, rgb(240,240,224).
Lo que pasa es que es muy lento. He puesto "for i = 1 to 1280" y luego "for j = 1 to 1024", los dos con "step 50", y tarda 11 segundos, y tiene el problema de saltárse lo que busco.
Si pongo "step 1" supongo que tardará 2500 veces más (7 horas), lo cual es, lógicamente, inviable. Pero el procesador ni se inmuta, por lo que no sé dónde está el gasto de tiempo.
¿Hay otra forma de recorrer la pantalla en menos tiempo?
El código, de momento, es este:
<code>
Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
Private Declare Function GetWindowDC Lib "user32.dll" (ByVal hwnd As Integer) As Integer
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Integer
Dim Kol As Color
Dim Xpix As Integer
Dim Ypix As Integer
Public Function PixelColor(ByVal x As Integer, ByVal y As Integer) As Color
Dim winDc = GetWindowDC(GetDesktopWindow)
Dim color = GetPixel(winDc, x, y).ToString
PixelColor = System.Drawing.ColorTranslator.FromOle(color)
End Function
Public Sub JMScan()
Dim I As Integer
Dim J As Integer
For I = 1 To 1280 Step 50
For J = 1 To 1024 Step 50
Kol = PixelColor(I, J)
If (Kol.R = 240) And (Kol.G = 240) And (Kol.B = 224) Then
MsgBox(I & " x " & J) ' <-- aquí luego pondré otras cosas
End If
Application.DoEvents()
Next J
Next I
MsgBox("Escaneo Terminado")
End Sub
</code>
Valora esta pregunta


0