Что является более быстрым способом FindBitmap от Lockbits c # найти те же изображения - PullRequest
0 голосов
/ 12 сентября 2018

Какой метод найдет мне картинку в другом изображении?Findmap или Lockbits?

Код блокировки:

bool equals = true;
            Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
            BitmapData bmpData1 = bmp1.LockBits(rect, ImageLockMode.ReadOnly, bmp1.PixelFormat);
            BitmapData bmpData2 = bmp2.LockBits(rect, ImageLockMode.ReadOnly, bmp2.PixelFormat);
            unsafe
            {
                byte* ptr1 = (byte*)bmpData1.Scan0.ToPointer();
                byte* ptr2 = (byte*)bmpData2.Scan0.ToPointer();
                int width = rect.Width * 3; // for 24bpp pixel data
                for (int y = 0; equals && y < rect.Height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        if (*ptr1 != *ptr2)
                        {
                            equals = false;
                            break;
                        }
                        ptr1++;
                        ptr2++;
                    }
                    ptr1 += bmpData1.Stride - width;
                    ptr2 += bmpData2.Stride - width;
                }
            }
            bmp1.UnlockBits(bmpData1);
            bmp2.UnlockBits(bmpData2);

А есть код Findbotmap:

 private bool FindBitmap(Bitmap bmpNeedle, Bitmap bmpHaystack, out Point location)
        {
            try
            {
                for (int outerX = 0; outerX < bmpHaystack.Width - bmpNeedle.Width; outerX++)
                {
                    for (int outerY = 0; outerY < bmpHaystack.Height - bmpNeedle.Height; outerY++)
                    {
                        for (int innerX = 0; innerX < bmpNeedle.Width; innerX++)
                        {
                            for (int innerY = 0; innerY < bmpNeedle.Height; innerY++)
                            {
                                Color cNeedle = bmpNeedle.GetPixel(innerX, innerY);
                                Color cHaystack = bmpHaystack.GetPixel(innerX + outerX, innerY + outerY);

                                if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B)
                                {
                                    goto notFound;
                                }
                            }
                        }
                        location = new Point(outerX - 8, outerY - 32);
                        return true;
                        notFound:
                        continue;
                    }
                }
                location = Point.Empty;
                return false;
            }
            catch { location = Point.Empty; return false; }
        }

Вопрос в том, какой метод быстрее и почему?Я искал много тем и т. Д. И все еще не могу найти, какой метод будет лучше проверить изображение внутри другого изображения (или 2 изображения одинаковы).Может кто-нибудь, кто знает тему, рассказать об этом подробнее?И какой метод я должен использовать, чтобы проверить, если изображения одинаковы?Спасибо за советы и, пожалуйста, не делайте дубликатов. Я много искал и не могу найти ответ по этой теме.

...