[C#] 동적 Bitmap 생성

.NET에서 C# 코드로 비트맵을 생성하고 생성한 이 비트맵에 원하는 그래픽 요소를 그린 후 스트림에 전송하는 방법에 대한 정리입니다. 매우 간단한 내용이지만 그래픽에 대해 관심이 많은 개발자로써 천천히 정리해 봤습니다.

int w = 100;
int h = 100;

Image img = new Bitmap(w, h);
Graphics grp = Graphics.FromImage(img);

위의 코드는 100×100 크기의 비트맵 이미지를 생성하고 이 이미지에 그래픽 요소를 그리기 위한 Graphics 클래스의 인스턴스와 바인딩 합니다. 이제 Graphics 클래스의 인스턴스 변수인 grp를 이용해 우리가 원하는 그래픽 요소를 그릴 수 있습니다. 아래는 간단하게 선을 그리고 파일로 저장하는 코드입니다.

grp.DrawLine(Pens.Aqua, 10, 10, 90, 90);
img.Save("d:/a.bmp");

저장된 파일은 아래와 같습니다.

그림을 살펴보면.. 그래픽 객체로 직접 선을 그린 픽셀을 제외하고 나머지 픽셀들은 모두 투명이라는 것을 알 수 있습니다. 그리고 아래의 코드는 비트맵 이미지를 구성하는 픽셀 하나 하나에 대한 색상 정보를 가져올 수 있는 힌트를 제공하는 코드입니다.

Bitmap bmp = img as Bitmap;
Color clr = bmp.GetPixel(10, 10);
MessageBox.Show(clr.ToString());

MessageBox를 통해 Color타입의 clr을 toString 매서드를 통해 얻은 값은 아래 그림과 같습니다. 자바와 같이 C# 역시 모든 객체에 대해 toString() 매서드를 제공하여 자신에 대한 정보를 사용자가 읽어 파악할 수 있는 문자열 형태의 값을 제공하고 있습니다.

사용자 삽입 이미지
끝으로 픽셀값을 Color 타입으로 가져오고 있습니다. Color는 퍼포먼스를 위해서 클래스가 이난 구조체 타입으로 선언되어 있습니다.

[C#] DataTable 생성

NET의 DataTable은 개발자들에 데이터를 주고 받기 위한 인터페이스로써의 표준으로 생각해도 별 무리가 없을듯 합니다. 아직은 .NET 초년생이라 잘 모르겠습니다만… 어떤 형식을 가지고 있는 데이터를 개발자 사이에서 주고 받을때 데이터 덩어리만 툭… 던져주기 보다는 이 데이터 덩어리를 읽을 수 있는 인인터페이스까지 제공해 주면 더욱 좋을텐데요. 바로 이 인터페이스가 되는 녀석으로 DataTable을 사용하면 참 좋을것 같습니다.

DataTable은 이 클래스의 이름에서도 나와 있듯 데이터베이스에서 테이블에 해당하는 녀석입니다. 테이블은 필드들로 구성되어 있고.. 이 필드들에 대한 레코드들로 구성됩니다. 필드는 컬럼(Column)이라고도 하며 레코드는 로우(Row)라고도 합니다.

데이터에 대해서 개발자 서로간에 인정할 수 있는 방법으로써 DataTable을 사용해야 할 필요가 생겨 DataTable을 생성하는 방법에 대해 정리해 봅니다.

사용자 삽입 이미지
위의 도식도를 보면 DataTable은 DataColumn과 DataRow 클래스에 대한 다수의 인스턴스를 가지고 있다는 것을 알 수 있습니다. DataColumn은 필드의 정의이며 DataRow은 레코드에 대한 정의입니다. .NET을 개발한 MS 개발자들 덕에 참…. 쉽죠잉? -_-;

먼저 DataTable을 생성하는 코드는 아래와 같습니다.

DataTable dt = new DataTable("TableName");

생성자의 인자는 테이블의 이름입니다. 참고로 다수의 DataTable은 DataSet에 포함될 수 있는데 이 DataSet에서의 식별자가 바로 이 테이블의 이름입니다. 식별자이므로 당연히 중복되는 큰~ 일 나는 겁니다.

다음은 이렇게 생성한 테이블에 필드를 정의하는 코드입니다. 식별자로써 ID와 이름으로써 Name, 나이값으로써 Age 필드를 정의하는 코드입니다.

DataColumn col1 = new DataColumn();
col1.DataType = System.Type.GetType("System.Int32");
col1.ColumnName = "ID";
col1.AutoIncrement = true;
dt.Columns.Add(col1);

DataColumn col2 = new DataColumn();
col2.DataType = System.Type.GetType("System.String");
col2.ColumnName = "Name";
col2.DefaultValue = "No Name";
dt.Columns.Add(col2);

DataColumn col3 = new DataColumn();
col3.DataType = System.Type.GetType("System.Int32");
col3.ColumnName = "Age";
col3.DefaultValue = 0;
dt.Columns.Add(col3);

각 필드(컬럼)에 대한 데이터 타입은 .NET의 Type의 그것을 그대로…. 사용할 수 있도록 되어 있습니다. 그리고 아래는 이제 이렇게 정의된 필드에 대해 레코드를 추가하는 코드입니다.

DataRow dr1 = dt.NewRow();
dr1["Name"] = "개똥이";
dr1["Age"] = 10;
dt.Rows.Add(dr1);

DataRow dr2 = dt.NewRow();
dr2["Name"] = "소똥이";
dr2["Age"] = 13;
dt.Rows.Add(dr2);

DataRow dr3 = dt.NewRow();
dr3["Name"] = "말똥이";
dr3["Age"] = 15;
dt.Rows.Add(dr3);

레코드에 해당되는 DataRow는 DataTable의 NewRow 매서드를 통해 생성된다는 점에 주의해야 합니다.

끝으로 테이블을 정의할때 Primary Key 등과 같은 정의를 빼놓을 수 없습니다. 아래는 간단히 앞서 정의한 ID 필드값으로 Primary Key를 정의하는 코드입니다.

DataColumn[] key = new DataColumn[1];
key[0] = col1;
dt.PrimaryKey = key;

이상으로 기본적으로 DataTable을 생성하고 컬럼과 레코드를 추가하는 것에 대해 정리해 보았습니다.