NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 매크로 프로그램 만들기. (이미지 체크)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 직접 매크로 프로그램을 만들려면 기본적으로 몇가지 기능들을 기본으로 제공해야 합니다. 마우스와 키보드 조작은 기본이고, 이미지 체크나 이미지 서치와 같은 판단 로직을 만들 수 있어야 하죠. 아래 코드는 사용자가 설정한 위치에 이미지가 출현하는지를 판단할 수 있는 소스 코드입니다.

    /// <summary>
    /// 이미지 체크 결과를 반환합니다.
    /// </summary>
    /// <param name="source">사용자가 캡쳐한 원본 이미지입니다.</param>
    /// <param name="target">현재 화면의 대상 이미지입니다.</param>
    /// <param name="tolerance">원본 이미지(Source)와 대상 이미지(Target)를 비교할 공차값입니다. 이 값을 설정하면 비교할 이미지의 컬러값이 다르더라도 True를 반환합니다.</param>
    /// <param name="skipTransparent">이미지의 투명 값을 제외합니다. 투명 값을 제외하면 속도가 향상될 수 있습니다.</param>
    /// <param name="performance">이미지를 비교할 때 성능을 설정합니다. 성능을 최대(0)로 설정하면 속도가 빨라지지만 CPU 사용량이 일시적으로 증가할 수 있습니다. 멀티 환경이라면 CPU 사용량을 적절하게 관리하는게 중요합니다.</param>
    /// <returns>원본 이미지와 대상 이미지가 같으면 True를 반환합니다.</returns>
    [HandleProcessCorruptedStateExceptions]
    public unsafe static bool IsCheck(Image source, Image target, int tolerance = 0, bool skipTransparent = false, int performance = 0)
    {
        if (NSL.ModuleCheck.Invalid) return false;
    
        if (performance > 0)
        {
            _performanceCount = 0;
            _performanceLimit = performance * (int)(Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height * 0.1);
            _performanceCheck = true;
        }
        else
        {
            _performanceCount = 0;
            _performanceCheck = false;
        }
    
        try
        {
            using (Mat ss = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)source))
            {
                using (Mat s = ss.CvtColor(ColorConversionCodes.RGB2RGBA))
                {
                    using (Mat tt = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)target))
                    {
                        using (Mat t = tt.CvtColor(ColorConversionCodes.RGB2RGBA))
                        {
                            for (int row = 0; row < s.Rows; row++)
                            {
                                Vec4b* sc = (Vec4b*)s.Ptr(row).ToPointer();
    
                                for (int col = 0; col < s.Cols; col++)
                                {
                                    if (sc[col].Item3 == 0 && skipTransparent)
                                    {
                                        continue;
                                    }
    
                                    Vec4b* tc = (Vec4b*)t.Ptr(row).ToPointer();
    
                                    int[] upRGB =
                                        {
                                        tc[col].Item0 + OpenCV.TOLERANCE + tolerance,
                                        tc[col].Item1 + OpenCV.TOLERANCE + tolerance,
                                        tc[col].Item2 + OpenCV.TOLERANCE + tolerance
                                    };
    
                                    int[] downRGB =
                                        {
                                        tc[col].Item0 - tolerance,
                                        tc[col].Item1 - tolerance,
                                        tc[col].Item2 - tolerance
                                    };
    
                                    for (int i = 0; i < 3; i++)
                                    {
                                        _performanceCount++;
                                        if (_performanceCheck && _performanceCount > _performanceLimit)
                                        {
                                            System.Threading.Thread.Sleep(1);
                                            _performanceCount = 0;
                                        }
    
                                        if (upRGB[i] > 255)
                                        {
                                            upRGB[i] = 255;
                                        }
    
                                        if (downRGB[i] < 0)
                                        {
                                            downRGB[i] = 0;
                                        }
    
                                        if (sc[col][i] > upRGB[i] || sc[col][i] < downRGB[i])
                                        {
                                            return false;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return true;
        }
        catch (AccessViolationException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

     

    엔지엠의 프레임워크를 사용하면 메소드를 호출해서 쉽게 매크로 제작이 가능해집니다. 엔지엠 에디터 엔터프라이즈를 구매하시면 프레임워크 및 디자이너를 무료로 제공합니다. 홈페이지에 [ 디자이너 메뉴얼 ]을 참고하시면 좀 더 쉽고 빠르게 나만의 매크로 프로그램을 제작할 수 있습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.