- oracle
- 다빈치 리졸브
- Unity
- postman tests
- LSL_Script
- postman
- postman excel
- c#
- postman html parse
- emplace_back
- MFC
- postman csv
- postman session
- postman automations
- postman pre-request
- Interaction developer
- web developer
- Java
- 우수한 프런트 개발자
- solidity
- postman collection
- 프런트엔드
- 좋은 개발자
- Front-end developer
- UI/UX Engineer
- C++
- Android/iOS Developer
- postman collection variables
- Intellij
- Android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Today
- Total
david's daily developer note
C#, 이미지 작업. 본문
C#에서 이미지 작업을 위한 기본적인 소스를 작성해본다.
1. 화면에 뿌려질 바탕 이미지를 초기화 한다. 뿌려질 폼의 크기와 같은 Bitmap 클레스를 만들고, Bitmap 클레스에서 Graphics을 얻어온다. 아래 소스의 grBm 은 바탕 이미지의 Graphics이 되고, 오픈한 이미지나 작업한 이미지를 뿌리게 된다.
Bitmap drawBitmap = new Bitmap(ClientSize.Width, ClientSize.Height);
Graphics grBm = Graphics.FromImage(drawBitmap);
grBm.Clear(BackColor);
2. 앞에서 이미지를 뿌리기 위해서 초기화한 Graphics를 뿌려주는 이벤트를 추가하자. 이벤트는 폼의 변화가 발생하면 발생해야 함으로, Window Form의 Paint이벤트를 추가한다. 다음의 함수는 발생되는 Draw 이벤트에서 그래픽을 얻어오고, 해당 그래픽을 이용해서 앞서 만든 바탕 이미지를 뿌린다.
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics gr = e.Graphics;
gr.DrawImage(drawBitmap, 0, 0);
}
3. 1번 과정에서 이미지를 그릴, 바탕 이미지를 만들었고, 바탕 이미지가 Draw될 수 있는 이벤트를 추가하였다. 다음은 실제 출력할 이미지를 불러와서 출력하자.
Image image = Image.FromFile(filePath); // image
grBm.DrawImage(image, 0, 0, image.Width, image.Height);
기본적인 이미지 불러오기와 뿌리는 방법을 알았다. 추가로, 픽셀 단위 영상 처리를 위해서 불러온 이미지를 그레이스케일(Gray-Scale)로 변환하고, 다시 출력가능한 이미지로 복귀하는 방법을 알아보자.
4. 그레이스케일(Gray-Scale)로 변환
아래 함수의 내용은, Bitmap 을 Gray이미지로 바꾸는 과정이다. 이미지의 각 픽셀 단위 연산을 위해서는 Image 클레스를 아래와 같이 Bitmap 클레스로 변환하여 처리한다. Bitmap의 각 픽셀은 X,Y축 정보로 접근 가능하며, GetPixel 함수로 읽어올 수 있다. 이 때, 각 한 픽셀단위를 처리하는 클레스는 Color이다. 즉, 아래의 함수는 Bitmap의 각 픽셀의 R,G,B값을 섞어서 0~255값 사이의 Gray값으로 변환한다.
Bitmap bitmap = new Bitmap(image);
int[,] GrayScale(Bitmap tempImage)
int x, y, brightness;
Color color;
int[,] grayArray = new int[tempImage.Height, tempImage.Width];
for (y = 0; y < tempImage.Height; y++) {
for (x = 0; x < tempImage.Width; x++) {
color = tempImage.GetPixel(x, y);
brightness = (int)(0.299 * color.R + 0.578 * color.G + 0.114 * color.B);
grayArray[y, x] = brightness;
}
}
return grayArray;
5. 생성한 Gray이미지를 출력가능한 Bitmap으로 변환. 이 과정은 앞의 4번 과정의 반대로, 2차원 int 배열로 저장된 gray 이미지의 각 픽셀을 Color 클레스로 생성하고, 새로운 Bitmap에 생성된 Color클레스를 입력하는 방식이다. 최종 출력되는 이미지는 그레이 스케일된 이미지이다.
int x, y;
Color color;
Bitmap gBitmap = new Bitmap(Width, Height);
for (y = 0; y < Height; y++) {
for (x = 0; x < Width; x++) {
color = Color.FromArgb(resultArray[y, x], resultArray[y, x], resultArray[y, x]);
gBitmap.SetPixel(x, y, color);
}
}
6. 4,5번 과정을 응용해서, R,G,B값을 잃어버리지 않고도 영상 처리할 수 있으며, 픽셀 단위 처리하는 왠만한 영상 처리를 할 수 있다.
'[Develop] Language > C#' 카테고리의 다른 글
C# Using 문의 try/catch 확장 (0) | 2011.01.03 |
---|---|
C# 다수의 버튼 컨트롤을 동적으로 생성 및 버튼 이동시키는 이벤트 추가하기 (2) | 2010.12.29 |
.NET 응용 프로그램의 관리자 권한 수행. (0) | 2010.11.05 |
C#, 상속 관계가 존재하는 Class들에 대한 is연산중 범할 수 있는 논리 오류.. (0) | 2010.10.27 |
.NET 텍스트 파일 한글 읽어오기. (0) | 2010.10.27 |