NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • NGM 5
  • 매뉴얼

    NGM 5의 매뉴얼입니다.

    NGM 5

    NGM 5의 매뉴얼입니다.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    커스텀 [2부] 커스텀 조건 액션 만들기. (이미지 체크와 서치, 매치를 한방에 처리하기)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 이전에 작업한 MyImageCheckModel에 몇 가지 기능을 추가해서 좀 더 쓸만한(?) 액션으로 변화시켜 보겠습니다. 물론, NGM에서 제공하는 훌륭한(?) 이미지 체크 액션이 있지만요^^;

     

    아무튼 오늘 추가할 내용은 이미지 체크, 서치 및 매치를 한번에 처리할 수 있도록 하는 기능입니다. 물론, NGM에서 제공하는 기능이 더 좋죠-_-; CustomAction 프로젝트를 실행합니다. 그리고, 이전에 작업하던 MyImageCheckModel.cs 파일을 열어주세요.

    img.png

     

     

     

    여기까지 작업하고 테스트는 해보셨겠죠? 아마 잘~ 작동될겁니다. 이제 이 코드에서 몇 가지 속성을 더 추가하고 멀티 이미지 조건을 적용시켜 볼게요. 우선 아래와 같이 속성을 추가하세요.

    MyImageCheckModel.cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace CustomAction
    {
        [Serializable]
        public class MyImageCheckModel : NGM.Models.Interface.BaseCustomConditionToolModel
        {
            public override string DisplayCategory { get { return "My Condition"; } }
     
            public override string DisplayName { get { return "My Image Check"; } }
     
            [TypeConverter(typeof(NGM.Models.TypeConverter.ImageConverter))]
            public string ImageName { get; set; }
     
            public int Tolerance { get; set; }
     
            public int Performance { get; set; }
     
            public override bool? Execute()
            {
                NGM.Models.ImageModel model = NGM.Models.Interface.SystemHelper.GetImageModel(this.ImageName);
                Image sourceImage = (Image)model.Image.Clone();
                Image targetImage = NGM.Utility.ScreenCaptureManager.ScreenShot.GetActiveImage(model.ImageRectangle);
     
                return NGM.Utility.ImageManager.ImageCondition.IsCheck(sourceImage, targetImage, Tolerance, false0);
            }
        }
    }
    cs
     

     

    추가한 속성은 21라인과 23라인입니다. 먼저 21라인은 NGM 의 이미지 관련 조건들이 제공하는 공차(Tolerance)를 말합니다. 이미지 체크와 서치는 이미지의 픽셀 정보를 기반으로 체크하게 되는데요. 이때 픽셀의 색상 정보(ARGB)가 일치하지 않더라도 같은 이미지로 판단할 때 사용합니다. 공차 값이 높을수록 다른 색상의 픽셀도 같다고 판단합니다. 23라인은 성능(Performance, 퍼포먼스)을 조절하는 옵션입니다. 컴퓨터의 성능을 최상으로 사용하려면 0을 입력하고 최하위로 사용하려면 1을 입력하면 됩니다. 최상의 성능은 아니더라도 90프로의 성능을 사용하고 싶으면 90을 입력하면 됩니다.

     

    참고로 퍼포먼스 값이 낮을수록 CPU에 부하는 작게 가지만 성능은 떨어집니다. 이미지를 찾거나 비교하는데 시간이 오래 걸린다는 거죠. 자신의 컴퓨터 성능에 따라서 절적하게 쓰는 게 가장 좋습니다. 하지만, 멀티로 스크립트를 돌리는 게 아니라면 크게 의미가 없는 속성입니다. 다수의 매크로를 동시에 돌릴 때 효과를 볼 수 있습니다.

     

    이미지 체크, 서치 및 매치 또는 전체를 체크하기 위한 속성을 하나 추가하죠~ 단순히 속성만 추가해서는 뭔가 아름답지 않습니다. 사용자의 편의를 위해 enum type을 제공해주는게 좋겠죠? enum은 열거형(Enumerations)으로 변수에 할당할 수 있는 상수 집합을 쉽게 정의하고 사용하는 방법을 제공해줍니다. 클래스로 만들어도 되지만, 편의상 열거형을 사용하는 게 좋습니다.

    MyImageCheckModel.cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace CustomAction
    {
        public enum ConditionType { Check, Search, Match, All }
     
        [Serializable]
        public class MyImageCheckModel : NGM.Models.Interface.BaseCustomConditionToolModel
        {
            public override string DisplayCategory { get { return "My Condition"; } }
     
            public override string DisplayName { get { return "My Image Check"; } }
     
            [TypeConverter(typeof(NGM.Models.TypeConverter.ImageConverter))]
            public string ImageName { get; set; }
     
            public int Tolerance { get; set; }
     
            public int Performance { get; set; }
     
            [Description("이미지 판단에 사용되는 방식을 선택하세요." +
                "All을 선택하면 Check, Search, Match 순으로 순차 체크하며" +
                "하나라도 True가 되면 이 후 조건은 처리하지 않습니다.")]
            public ConditionType ConditionType { get; set; }
     
            public override bool? Execute()
            {
                NGM.Models.ImageModel model = NGM.Models.Interface.SystemHelper.GetImageModel(this.ImageName);
                Image sourceImage = (Image)model.Image.Clone();
                Image targetImage = NGM.Utility.ScreenCaptureManager.ScreenShot.GetActiveImage(model.ImageRectangle);
     
                return NGM.Utility.ImageManager.ImageCondition.IsCheck(sourceImage, targetImage, Tolerance, false0);
            }
        }
    }
    cs
     

     

    위 코드의 11라인에서 열거형을 정의했습니다. 이 열거형은 액션이 이미지를 체크할 때 어떤 이미지 컨디션을 사용할지 선택하게 해줍니다. 그리고, 27~30라인은 11라인에서 정의한 열거형을 사용자로부터 입력받기 위한 속성입니다. 심심해서 Description Attribute를 하나 달아줬습니다-_-; 앗~!!! 기본 값을 설정하지 않았군요. 아래와 같이 30라인을 수정하세요.

    27
    28
    29
    30
            [Description("이미지 판단에 사용되는 방식을 선택하세요." +
                "All을 선택하면 Check, Search, Match 순으로 순차 체크하며" +
                "하나라도 True가 되면 이 후 조건은 처리하지 않습니다.")]
            public ConditionType ConditionType { get; set; } = ConditionType.Check;
    cs
     

     

     

    이제 핵심 코드를 작성해야 하는군요. Execute 메소드의 전체 코드는 아래와 같습니다.
    img.png 
     

     

    동시에 이미지 체크, 서치 및 매치를 적용시키려다 보니 코드 내용이 많이 길어졌습니다. 그래도 개별적으로 액션을 사용하는 것보다는 콤보박스에서 원하는 조건을 선택해서 바로 적용할 수 있다는 아주 큰(?) 메리트가 있죠~ 글로 설명하기에는 너무나도 힘든 작업이 될듯하여 유튜브 동영상으로 대신하겠습니다. 설명을 잘할 수 있을지 걱정이 앞서는군요-_-;

     

     

     

    개발자에게 후원하기

    img.jpg

     

     

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

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

    감사합니다~

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

    댓글목록

    profile_image

    문해님의 댓글

    no_profile 문해 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일 Date

    29줄, 35줄
    if (!result)가 아니라
    if(result)가 되어야 로직이 맞는거 아닌가요?