Píxeles y Bucle For

Iniciado por calk9, 18 Septiembre 2011, 20:40 PM

0 Miembros y 1 Visitante están viendo este tema.

calk9

Buenas a todos, estoy realizando una aplicacion la cual en un bucle for recorre, moviende el mouse, una determinada área y al encontrar un píxel con determinado color, se frene. EL PROBLEMA es que, al recorrer el área moviendo el cursor con el bucle previamente mencionado anda todo perfecto, con una rapidez considerable, en cambio cuando "coloco" el código para verificar si encuentra el píxel lo hace un 90% más lento. Este es mi código:

Código (vb) [Seleccionar]
Dim iX As Integer
Dim iY As Integer
Dim hdc As Long, pxColor As Double

   Call GetCursorPos(Mouse)
   For iX = Mouse.x To Mouse.x + 100
       For iY = Mouse.y To Mouse.y + 75
           Call SetCursorPos(iX, iY)
           'Hasta acá todo bien, lo que viene ahora es lo que lenta muchísimo mi aplicación...
           
           hdc = GetDC(0)
           pxColor = GetPixel(hdc, Mouse.x, Mouse.y)
           ReleaseDC 0, hdc
           Me.Caption = Hex(pxColor)
           If Me.Caption = "AA431B" Then
               Exit For
           End If
           '//
       Next iY
   Next iX


No se cual es el problema, por qué lo hace muchísimo mas lento. Ya que sin verificar el color lo hace en unas milésimas de segundo, y luego con el código para verificar tarda unos 20 o 30 en recorrer el mouse todo el área. Pues ni me imagino cuando haga áreas mas grandes.

Saludos.

Sanlegas

Te recomendaria que averigues sobre el formato Bitmap ... es mucho mas rapido, salu2 !

raul338

Exacto, toma un screenshot de la pantalla y de ahi analizalo :P

calk9

Pues es en tiempo real... como podría hacer?

ignorantev1.1

Perdon que me meta pero:

Llevo tiempo buscando y no encuentro nada al respecto
¿Hay alguna forma de volcar el contenido de un bitmap(de un contenedor) a un array?

Esa (creo) sería la forma mas rápida de encontrar determinado pixel...

Saludos!

raul338

Cita de: ignorantev1.1 en 18 Septiembre 2011, 21:14 PM
Llevo tiempo buscando y no encuentro nada al respecto
¿Hay alguna forma de volcar el contenido de un bitmap(de un contenedor) a un array?

Esa (creo) sería la forma mas rápida de encontrar determinado pixel...
un BMP es un array de por si con un par de bytes mas :P

Aca en un tuto de DirectX para C# explican mas o menos como leer un bmp desde archivo :P: http://www.riemers.net/eng/Tutorials/DirectX/Csharp/Series1/tut10.php
No hace falta saber mucho C# para entenderlo, tiene una buena introduccion :P

calk9

Aver si me pueden ayudar con mi planteo...

Sanlegas

Cita de: ignorantev1.1 en 18 Septiembre 2011, 21:14 PM
Perdon que me meta pero:

Llevo tiempo buscando y no encuentro nada al respecto
¿Hay alguna forma de volcar el contenido de un bitmap(de un contenedor) a un array?

Esa (creo) sería la forma mas rápida de encontrar determinado pixel...

Saludos!

Si, es posible http://carlosagreda.blogspot.com/2008/02/destripando-un-bmp-24-bits.html


ignorantev1.1

@calk9

¡Tu no te metas!... Hahaha es broma  :xD

Esto te consumirá tiempo valioso siempre:
CitarCall SetCursorPos(iX, iY)

No entiendo el porqué lo ideal sería colocar el cursor luego de encontrar el pixel que se busca, pero pues sabes lo que haces.

Y todo esto:
Código (vb) [Seleccionar]
          hdc = GetDC(0)
            pxColor = GetPixel(hdc, Mouse.x, Mouse.y)
            ReleaseDC 0, hdc
            Me.Caption = Hex(pxColor)
            If Me.Caption = "AA431B" Then
                Exit For
            End If


yo lo reduciría a esto:
Código (vb) [Seleccionar]
      Me.Caption = Hex$(point(ix,iy)
      If Me.Caption = "AA431B" Then
          Exit For
      End If


@Raul338, @Tenient101
Pues ambos son buenos tutoriales, pero no me referia a eso precisamente:  :xD

Más bien a cuando la imagen se almacena en un contenedor, por ejemplo hacer unos trazados en un picturebox(lineas, círculos y pintados), todo esto queda almacenado en el campo "image" del contenedor(picturebox o form), ahora volvar el contenido de "image" a un array, creo que la clave está en localizar el punto en memoria donde se almacena "image"... Saludos!

calk9

Pues sigo teniendo el mismo problema. El API SetCursorPos no es el problema, ese bucle lo hace en unas milesimas de segundo. El problema es el ver el color del pixel.
Gracias igual! ;D

Sigo esperando respuestas...

P.D: Te importaría darme tu msn?