Hi,
to optimize it you can do follow:
1) put your BigImage in a structure (Color, x, y)
2) order it by color
3) do the same with your small Img
4) select the color with less pixels
5) search in this structure just for one color, for example:
The small picture have 4 red pixels. Store this information in the form x,y for the first, x+a,y+b for the second and so on. Then take the first pixel in the Big stucture in the "red section". If Abs(x[0]-x[1])=a => it may be the right pixel, else If x[0]-x[2]=a and so on. (check also the y only if it match) When the first two points match, do it again with the third and so on.
Working with in-memory structure (Array or TList or something else) should dramatically increase your speed, because you don't have to manage DeviceContext, Canvas, and other stuff that brakes your procedure, any you read the pixel only ones.
Of course this method won't be the best if you examin the image of a ChessBoard (with many x[0]-x[1]=a), but for many pictures it should be ok.
P.S.
I wrote a better answer, but this site crashes when uploading, and my WellWritingImpulse is gone with it.
Just ask me if something is not clear.
Ciao,
Geppo Darkson.