public static List <System.Drawing.Point> GetSubPositions(Image main, Image sub) { List <System.Drawing.Point> possiblepos = new List <System.Drawing.Point>(); Bitmap mainBitmap = main as Bitmap; Bitmap subBitmap = sub as Bitmap; mainBitmap = GrayScale(mainBitmap); subBitmap = GrayScale(subBitmap); int mainwidth = mainBitmap.Width; int mainheight = mainBitmap.Height; int subwidth = subBitmap.Width; int subheight = subBitmap.Height; int movewidth = mainwidth - subwidth; int moveheight = mainheight - subheight; BitmapData bmMainData = mainBitmap.LockBits(new System.Drawing.Rectangle(0, 0, mainwidth, mainheight), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); BitmapData bmSubData = subBitmap.LockBits(new System.Drawing.Rectangle(0, 0, subwidth, subheight), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); int bytesMain = Math.Abs(bmMainData.Stride) * mainheight; int strideMain = bmMainData.Stride; System.IntPtr Scan0Main = bmMainData.Scan0; byte[] dataMain = new byte[bytesMain]; System.Runtime.InteropServices.Marshal.Copy(Scan0Main, dataMain, 0, bytesMain); int bytesSub = Math.Abs(bmSubData.Stride) * subheight; int strideSub = bmSubData.Stride; System.IntPtr Scan0Sub = bmSubData.Scan0; byte[] dataSub = new byte[bytesSub]; System.Runtime.InteropServices.Marshal.Copy(Scan0Sub, dataSub, 0, bytesSub); for (int y = 0; y < moveheight; ++y) { for (int x = 0; x < movewidth; ++x) { MyColor curcolor = GetColor(x, y, strideMain, dataMain); foreach (var item in possiblepos.ToArray()) { int xsub = x - item.X; int ysub = y - item.Y; if (xsub >= subwidth || ysub >= subheight || xsub < 0) { continue; } MyColor subcolor = GetColor(xsub, ysub, strideSub, dataSub); if (!curcolor.Equals(subcolor)) { possiblepos.Remove(item); } } if (curcolor.Equals(GetColor(0, 0, strideSub, dataSub))) { possiblepos.Add(new System.Drawing.Point(x, y)); } } } System.Runtime.InteropServices.Marshal.Copy(dataSub, 0, Scan0Sub, bytesSub); subBitmap.UnlockBits(bmSubData); System.Runtime.InteropServices.Marshal.Copy(dataMain, 0, Scan0Main, bytesMain); mainBitmap.UnlockBits(bmMainData); return(possiblepos); }
public static Point GetSubPositions(Bitmap main, Bitmap sub) { List <Point> possiblepos = new List <Point>(); int mainwidth = main.Width; int mainheight = main.Height; int subwidth = sub.Width; int subheight = sub.Height; int movewidth = mainwidth - subwidth; int moveheight = mainheight - subheight; BitmapData bmMainData = main.LockBits(new Rectangle(0, 0, mainwidth, mainheight), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); BitmapData bmSubData = sub.LockBits(new Rectangle(0, 0, subwidth, subheight), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); int bytesMain = Math.Abs(bmMainData.Stride) * mainheight; int strideMain = bmMainData.Stride; System.IntPtr Scan0Main = bmMainData.Scan0; byte[] dataMain = new byte[bytesMain]; System.Runtime.InteropServices.Marshal.Copy(Scan0Main, dataMain, 0, bytesMain); int bytesSub = Math.Abs(bmSubData.Stride) * subheight; int strideSub = bmSubData.Stride; System.IntPtr Scan0Sub = bmSubData.Scan0; byte[] dataSub = new byte[bytesSub]; System.Runtime.InteropServices.Marshal.Copy(Scan0Sub, dataSub, 0, bytesSub); var zeroColor = MyColor.FromARGB(0, 0, 0, 0); for (int y = 0; y < mainheight; ++y) { for (int x = 0; x < mainwidth; ++x) { MyColor curcolor = GetColor(x, y, strideMain, dataMain); foreach (var item in possiblepos.ToArray()) { int xsub = x - item.X; int ysub = y - item.Y; if (xsub >= subwidth || ysub >= subheight || xsub < 0) { continue; } MyColor subcolor = GetColor(xsub, ysub, strideSub, dataSub); if (!curcolor.Equals(subcolor) && !curcolor.Equals(zeroColor)) { possiblepos.Remove(item); } } if (x >= movewidth || y >= movewidth) { continue; } if (curcolor.Equals(GetColor(0, 0, strideSub, dataSub))) { possiblepos.Add(new Point(x, y)); } } } System.Runtime.InteropServices.Marshal.Copy(dataSub, 0, Scan0Sub, bytesSub); sub.UnlockBits(bmSubData); System.Runtime.InteropServices.Marshal.Copy(dataMain, 0, Scan0Main, bytesMain); main.UnlockBits(bmMainData); if (possiblepos.Count == 0) { return(null); } return(possiblepos[0]); }