[C#] Image Search Code

02/03/2014 00:32 GonzaFz#1
I want to share this code used to find an image within another.
Made it hotnoob watching videos and researching the method that uses "LockBits".

Here is the code:
PHP Code:
private struct PixelData
        
{
            public 
byte red;
            public 
byte green;
            public 
byte blue;
            public 
byte alpha;
            
        }


        
/// <summary>
        /// Se utiliza para obtener las coordenadas de una imagen dentro de otra. Devuelve el resultado en formato "Point"
        /// </summary>
        /// <param name="Fondo">Imagen base donde se encuentra la que se va a buscar</param>
        /// <param name="Imagen">Imagen que se desea buscar</param>
        /// <param name="Var">Cantidad permitida de variacion de pixeles, mientras menor sea menos sensible será el algoritmo</param>
        /// <returns>Point</returns>
        
public unsafe Point Busqueda(Bitmap FondoBitmap Imagenint Var)
        {

            
bool Encontrado false;
            
int Xinterno 0;
            
int Yinterno 0;
            
BitmapData FondoLock Fondo.LockBits(new Rectangle(00Fondo.WidthFondo.Height), ImageLockMode.ReadOnlyPixelFormat.Format32bppRgb);
            
BitmapData ImagenLock Imagen.LockBits(new Rectangle(00Imagen.WidthImagen.Height), ImageLockMode.ReadOnlyPixelFormat.Format32bppRgb);

            
PixelDataFondoP = (PixelData*)FondoLock.Scan0.ToPointer();
            
PixelDataImagenP = (PixelData*)ImagenLock.Scan0.ToPointer();

            for (
int Y 0< (FondoLock.Height ImagenLock.Height); Y++)
            {
                for (
int X 0< (FondoLock.Width ImagenLock.Width); X++)
                {
                    
PixelDataRFondo = (PixelData*)(FondoP Fondo.Width X);
                    
PixelDataRImagen = (PixelData*)(ImagenP);

                    if ((
Math.Abs(RFondo->red RImagen->red) <= Var) && (Math.Abs(RFondo->blue RImagen->blue) <= Var) && (Math.Abs(RFondo->green RImagen->green) <= Var))
                    {
                        
Encontrado true;
                        for (
Yinterno 0Yinterno < (ImagenLock.Height); Yinterno++)
                        {
                            for (
Xinterno 0Xinterno < (ImagenLock.Width); Xinterno++)
                            {
                                
PixelDataMFondo = (PixelData*)(RFondo Yinterno FondoLock.Width Xinterno);
                                
PixelDataMImagen = (PixelData*)(RImagen Yinterno ImagenLock.Width Xinterno);

                                if ((
Math.Abs(MFondo->red MImagen->red) > Var) || (Math.Abs(MFondo->blue MImagen->blue) > Var) || (Math.Abs(MFondo->green MImagen->green) > Var))
                                {
                                    
Encontrado false;
                                }
                            }
                        }
                        if (
Encontrado == true)
                        {
                            
Fondo.UnlockBits(FondoLock);
                            
Imagen.UnlockBits(ImagenLock);
                            return new 
Point((+ (Xinterno 2)), (+ (Yinterno 2)));
                        }
                    }

                }
            }
            
Fondo.UnlockBits(FondoLock);
            
Imagen.UnlockBits(ImagenLock);
            return new 
Point();
        } 
02/03/2014 19:28 [uLow]NTX?!#2
Nice that you Share your code, but you can Posts Code Snippets here:
[Only registered and activated users can see links. Click Here To Register...]

#moverequest
02/19/2014 01:18 MrSm!th#3
#moved