티스토리 뷰

C#

[C#] 픽셀서치 PixelSearch

PRG 2017.08.25 17:17

화면상의 픽셀을 얻기 위해서 BitBlt로 (1,1) 크기의 픽셀을 먼저 얻어봅시다.

// ex )  GetColorAt(pos);

/* [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
        public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);

추가하셔야 bitblt사용가능

*/

using System.Drawing;

       public Color GetColorAt(Point location)
        {
            Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);

            using (Graphics gdest = Graphics.FromImage(screenPixel))
            {
                using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
                {
                    IntPtr hSrcDC = gsrc.GetHdc();
                    IntPtr hDC = gdest.GetHdc();
                    int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
                    gdest.ReleaseHdc();
                    gsrc.ReleaseHdc();
                }
            }
       
            return screenPixel.GetPixel(0, 0);
        }

한 픽셀의 색을 얻는것이 이제 가능해졌습니다.

픽셀서치는 단순히 구간을 정해 GetPixel을 여러번한거죠. 그러면 screenPixel의 크기를 늘리고 BitBlt 로 캡쳐할 구간을 늘리면 되겠네요.

using System.Drawing;

 

        public bool PixelSearch(int left,int top,int right,int bottom,Color data)
        {
            int width = right - left;
            int height = bottom - top;
            Bitmap screenBitmap = new Bitmap(width,height, PixelFormat.Format32bppArgb);

            using (Graphics gdest = Graphics.FromImage(screenBitmap))
            {
                using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
                {
                    IntPtr hSrcDC = gsrc.GetHdc();
                    IntPtr hDC = gdest.GetHdc();
                    int retval = BitBlt(hDC, 0, 0, width, height, hSrcDC, left, top, (int)CopyPixelOperation.SourceCopy);
                    gdest.ReleaseHdc();
                    gsrc.ReleaseHdc();
                    for(int i = 0; i < height; i++)
                    {
                        for(int j=0; j< width; j++)
                        {
                            Color c = screenBitmap.GetPixel(0, 0);
                            if (c == data)
                                return true;
                        }
                    }
                }
            }
            return false;
        }

 

 

'C#' 카테고리의 다른 글

[C#] ImageSearch  (0) 2018.01.10
[C#] 이미지를 오로지 R , G , B 만으로 표현하기 (색 분류)  (0) 2017.12.28
[C#] 픽셀서치 PixelSearch 2  (0) 2017.09.16
[C#] 픽셀서치 PixelSearch  (4) 2017.08.25
[C#] Xamarin with CocosSharp 공튀기기  (0) 2017.03.04
[C#] 자마린 무료화  (0) 2017.03.01
댓글
  • 프로필사진 efd c#오늘처음하는데 다른것처럼 픽셀서치인데 0xfffff이런거 없나요?없는데어떻게서치되는건가요..? 2017.10.18 23:52 신고
  • 프로필사진 PRG 0xffffff 는
    RGB 가 각각 255 255 255 입니다.
    이거 이용해서 그냥 하시면되요
    2017.10.22 01:20 신고
  • 프로필사진 지루행 gdi32.dll을 넣어놔야할 위치좀 알려주실수있나용? 2017.10.22 12:37 신고
  • 프로필사진 PRG gdi32 에 대한 경로는 환경변수로 저장되있어요. 그냥 System32 또는 SysWOW64 에 있는 gdi32.dll 이 사용되는거에요. 만약 없다면 여기 넣어놔야겠죠. 2017.10.27 20:27 신고
댓글쓰기 폼