화면상의 픽셀을 얻기 위해서 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#] HSV에서 Hue 의 거리 (0) | 2018.07.09 |
---|---|
[C#] 이미지를 오로지 R , G , B 만으로 표현하기 (색 분류) (0) | 2017.12.28 |
[C#] 픽셀서치 PixelSearch 2 (0) | 2017.09.16 |
[C#] Xamarin with CocosSharp 공튀기기 (0) | 2017.03.04 |
[C#] 자마린 무료화 (0) | 2017.03.01 |
댓글