Ayuda con GetPixel (Ingresa para entender)

Iniciado por GonzaFz, 23 Mayo 2012, 23:07 PM

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

GonzaFz

Bueno resulta que ahora necesito encontrar una imagen, llamemosla "cuadro.bmp" en un WebBrowser.
Tengo un poco de idea de como hacer eso, por ejemplo, con un for para escanear todos los pixeles y determinar cuales son iguales y cuales no, pero el problema es que no se como seguir.
1º Mi codigo inicia con un GetwindowImage que es de alguien que encontre por internet, supongo que lo que hace es crear un nuevo bitmap con la imagen del webbrowser. No se si con WM_ se podria hacerlo de una ventana escondida (mejor dicho sacando solo foto del webbrowser).

2º El segundo codigo es para tomar la foto del WebBrowser.

3º Es el codigo para escanear los pixeles, y aquí es donde esta mi problema. Mi codigo escanea todos los pixeles, ahi vamos bien pero el problema es que el If realiza la acción por cada pixel que encuentra y eso no es lo que quiero. Me gustaria que primero escanee todo y luego realize el If solo 1 vez!

Más me gustaria poder hacer lo siguiente:
Que se realize el GetPixel y el For para ubicar todos los pixeles y que luego me devuelva las coordenadas donde se encuentra mi imagen "cuadro.bmp". No se si se entiende, seria primero el For seguido de el GetPixel para que escanee toda la pantalla y que luego encuentre mi imagen "cuadro.bmp" (con getpixel o otro metodo sencillo) y me de sus coordenadas de inicio.

Este es mi codigo. Espero que se haya entendido, y si me quieren ayudar y no entendieron mi explicación intentare hacerla mas simple.

Código (csharp) [Seleccionar]

private static Bitmap GetWindowImage(IntPtr hWnd, Size size) // CODIGO PARA TOMAR SCREENSHOT (LO ENCONTRE POR INTERNET)
        {
            try
            {
                if (size.IsEmpty || size.Height < 0 || size.Width < 0) return null;

                Bitmap bmp = new Bitmap(size.Width, size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bmp);
                IntPtr dc = g.GetHdc();

                if (PrintWindow(hWnd, dc, 0) == 0)
                {
                    MessageBox.Show("Fallo");
                }

                g.ReleaseHdc();
                g.Dispose();

                CloseHandle(dc);

                return bmp;
            }
            catch { return null; }
        }

        private Bitmap getBrowserSS()  // TOMO UN SCREENSHOT DEL WEBBROWSER
        {
            return GetWindowImage(webBrowser1.Handle, webBrowser1.Size);
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            Bitmap recursos = new Bitmap(@"D:\GO\cuadro.bmp");
            int X, Y;
            for (X = 0; X < getBrowserSS().Width; X++)
            {
                for (Y = 0; Y < getBrowserSS().Height; Y++)
                {
                    if (getBrowserSS().GetPixel(X, Y) == recursos.GetPixel(X, Y))
                    {
                       // ME GUSTARIA QUE ME DEVUELVA DONDE SE ENCUENTRA MI IMAGEN CUADRO.PNG
                    }
                    else
                    {
                        MessageBox.Show("Algo esta mal");
                    }
                }
            }



        }


Desde ya muchas gracias =).

Maurice_Lupin

Hace un tiempo simulé una especie de OMR con una imagen escaneada. Lo que me ayudo fue que la imagen estaba diseñada en Corel, ahi tenia todas las medidas, mi programa sólo se encargaba de buscar en lugares específicos, y no importaba si la imagen estaba reducida, pues todo estaba en proporción a lo que se diseñó en Corel.

En cuanto a comprobar los pixeles, si ya esta ubicada el cuadro a examinar, podrias avanzar de 10 en 10 para que no demore mucho la comprobación.

Podrías tener todo bien medido, que tu ventana no cambie de tamaño y sólo tendrías que buscar en un lugar especifico o si cambia que lo haga en proporción al ancho y alto de las medidas originales. Espero haberte ayudado.

Saludos.
Un error se comete al equivocarse.