728x90
반응형

HSV : hue saturation value의 약어. 색상(H), 채도(S), 명도(V) 를 의미한다.

 

아래 메서드를 통해 RGB,HSV 간에 변환을 할수 있다.

 

        /// <summary>

        /// Color 를 HSV 값으로 반환합니다.

        /// </summary>

        /// <param name="color">Color</param>

        /// <param name="hue">hue</param>

        /// <param name="saturation">saturation</param>

        /// <param name="value">value</param>

        public static void ColorToHSV(Color color, out double hue, out double saturation, out double value)

        {

            int max = Math.Max(color.R, Math.Max(color.G, color.B));

            int min = Math.Min(color.R, Math.Min(color.G, color.B));

 

            hue = color.GetHue();

            saturation = (max == 0) ? 0 : 1d - (1d * min / max);

            value = max / 255d;

        }

 

        /// <summary>

        /// HSV 값을 RGB 로 반환합니다.

        /// </summary>

        /// <param name="hue">hue</param>

        /// <param name="saturation">saturation</param>

        /// <param name="value">value</param>

        /// <returns>Color</returns>

        public static Color ColorFromHSV(double hue, double saturation, double value)

        {

            int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;

            double f = hue / 60 - Math.Floor(hue / 60);

 

            value = value * 255;

            int v = Convert.ToInt32(value);

            int p = Convert.ToInt32(value * (1 - saturation));

            int q = Convert.ToInt32(value * (1 - f * saturation));

            int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));

 

            if (hi == 0)      return Color.FromArgb(255, v, t, p);

            else if (hi == 1) return Color.FromArgb(255, q, v, p);

            else if (hi == 2) return Color.FromArgb(255, p, v, t);

            else if (hi == 3) return Color.FromArgb(255, p, q, v);

            else if (hi == 4) return Color.FromArgb(255, t, p, v);

            else              return Color.FromArgb(255, v, p, q);

        }

 

 

(테스트)

 

            Color blueColor = Color.LightBlue;

 

            ColorToHSV(blueColor, out double hue, out double saturation, out double value);

 

            Color convertColor =  ColorFromHSV(hue, saturation, value);

 

            if (blueColor.ToArgb() == convertColor.ToArgb())

            {

 

            }

 

 

값을 보면 같은 값으로 다시 변환되서 나온걸 확인 할수 있다.

 

 

 

728x90
반응형
728x90
반응형

// 2020 년 의 2월 일수를 가져옵니다. (결과:29)

int days = DateTime.DaysInMonth(2020, 2);

728x90
반응형
728x90
반응형

 

        string filePath = "그림파일위치";

 

        /// <summary>

        /// 그림판을 실행합니다.

        /// </summary>

        private void RunMSPaint()

        {

            ProcessStartInfo startInfo = new ProcessStartInfo(this.filePath);

            startInfo.Verb = "edit";

 

            Process.Start(startInfo);

        }

 

728x90
반응형
728x90
반응형

특정파일을 Windows  탐색기를 열어 선택하게 하는 코드

1.

using System.IO;

string filePath = @"D:\test.txt"; // 선택할 파일 


if (!File.Exists(filePath))

{

    return;

}


string argument = "/select, \"" + filePath + "\"";


System.Diagnostics.Process.Start("Explorer.exe", argument);



2.

[DllImport("shell32.dll", ExactSpelling = true)]

public static extern void ILFree(IntPtr pidlList);


[DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]

public static extern IntPtr ILCreateFromPathW(string pszPath);


[DllImport("shell32.dll", ExactSpelling = true)]

public static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);


string filePath = @"D:\test.txt"; // 선택할 파일 


var pidl = ILCreateFromPathW(filePath);

SHOpenFolderAndSelectItems(pidl, 0, IntPtr.Zero, 0);


ILFree(pidl);



728x90
반응형
728x90
반응형
string targetProcessPath = @"c:\windows\system32\notepad.exe";
string targetProcessName = "notepad";

Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
    if (process.ProcessName == targetProcessName && 
        process.MainModule != null &&
        string.Compare(process.MainModule.FileName, targetProcessPath, StringComparison.InvariantCultureIgnoreCase)==0)
    {
        process.Kill();
    }
}


특정 위치의 exe 파일의 실행 프로세스를 Kill 하는 코드.

728x90
반응형
728x90
반응형
private void DataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
   
var grid = sender as DataGridView;
   
var rowIdx = (e.RowIndex + 1).ToString();

   
var centerFormat = new StringFormat()
   
{
       
// right alignment might actually make more sense for numbers
       
Alignment = StringAlignment.Center,
       
LineAlignment = StringAlignment.Center
   
};

   
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
    e
.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}

 

위 방법이 제일 깔끔하게 표현이 되는것 같다.

728x90
반응형
728x90
반응형

2017/11/21 - [C#.NET/C#] - 카카오 쳇봇 만들기 - 1

 

이전시간에 이어 카카오 쳇봇 두번째 시간에는 서버를 만들어보겠습니다.

비쥬얼 스튜디오를 일단 열고

새 프로젝트를 만들어 아래와 같이 좌측목록에서 을 선택하고 우측에서 ASP.NET 웹 응용 프로그램 을 선택합니다.

아래와 같은 화면이 나오게 되는데 비어 있음 을 선택하고 Web API 는 체크하여 확인합니다.

그럼 아래처럼 프로젝트가 구성됩니다.

이제 카카오가 제시하는 호출 형식으로 웹서비스를 제공해야합니다.

아래처럼 Controllers 폴더 아래에 컨트롤러를 추가합니다.

읽기/쓰기 동작이 표함된 Web API 2 컨트롤러 를 선택하면 예시 코드를 볼수있어서

작성하는데 도움이 많이 됩니다.

도움이 필요없다면 Web API 런트롤러 - 비어있음 을 자신있게 선택하세요!!

컨트롤러가 추가되면 아래처럼 기본적인 Get Post Put Delete 메서드가 구현되어있습니다.

일단 이것을 참고하여 카카도톡이 제시한 http(s)://:your_server_url/keyboard 형식의 GET Method 를 구현해야합니다.

아래 설명에도 나와있지만 keyboard 는 채팅을 처음 시작할때 보여주는 메세지나 버튼을 처리하도록 합니다.

https://github.com/plusfriend/auto_reply#51-home-keyboard-api

GET 방식이므로 기본적으로 아래처럼 작성됩니다.

        [HttpGet]
        public dynamic GetKakao()
        {

            return null;
        }

json 형식을 처리하기위해 dynamic 으로 리턴처리가 되도록 하였습니다.

여기서 중요한건 http(s)://:your_server_url/keyboard 이런형태로 keyboard 로 주소가 끝나게 하여 호출이 되도록 해야합니다.

이를 위해선 [Route("keyboard")] 가 필요합니다.

        [HttpGet]
        [Route("keyboard")]
        public dynamic GetKakao()
        {

            return null;
        }

위처럼 하면 주소에 keyboard 로 호출하게되면 위 메서드가 타게됩니다.

이제 리턴을 아래 json 형태로 전달해야합니다.

{
    "type" : "buttons",
    "buttons" : ["선택 1", "선택 2", "선택 3"]
}

dynamic 을 이용해 위 형태를 만들어 보내면됩니다.

위 내용을 표현한다면 아래처럼 코딩하면됩니다.

            var result = new { type = "buttons", buttons = new List<string>() { "선택1", "선택2", "선택3" } };
            return result;

전체적으로 보면

        [HttpGet]
        [Route("keyboard")]
        public dynamic GetKakao()
        {
            var result = new { type = "buttons", buttons = new List<string>() { "선택1", "선택2", "선택3" } };
            return result;
        }

위처럼 됩니다.

이대로 IIS 올리게되면 플러스친구와 1:1 채팅을 하여 대화방이 열리면 버튼1,2,3 이 나타나게됩니다.

IIS 에 올리는 방법은 우선 빌드한 후 아래와 같이 프로젝트 우클릭 메뉴에서 게시 를 선택합니다.

IIS 에 바로 올릴수도 있지만 전 폴더로 빼서 직접 올렸습니다. 그래서 폴더를 선택하고

게시 버튼을 누르게 되면 게시가 진행됩니다.

게시가 완료되면 해당 경로에 아래처럼 파일이 생성됩니다.

이 파일을 그대로 IIS 에 올리면 됩니다.

IIS 올린 후

https://center-pf.kakao.com/login

으로 이동하여 이전에 추가했던 플러스 친구로 들어가서

좌측의 스마트채팅으로 들어간 후 우측의 API 형 의 설정하기 버튼을 클릭합니다.


아래와 같은 화면에서 API 테스트를 진행해야합니다.

IIS 주소를 넣고 API 테스트 버튼을 클릭하여 아래와 같이 OK 가 떨어져야 제대로 셋팅이 된것입니다.

이제 플러스 친구와 1:1 채팅을 하면 아래와 같이 버튼이 나타나게됩니다.

직접하면 시간이 길지 않은데 포스팅하니 글이 길어지는군요;;;

다음 시간에는 응답형 API 를 이용해 응답처리를 하는것을 해보도록 하겠습니다.

프로젝트 파일을 첨부하고 싶었으나 용량이 커서 안되는군요 ㅜㅠ

728x90
반응형

+ Recent posts