본문 바로가기
[ Program ]/C#

소켓을 이용한 이미지 송수신 및 비트맵 이미지와 바이트형간의 형변환

by 관이119 2012. 9. 17.
이번 포스팅에서는 소켓을 이용해서 이미지를 송수신하는 방법과 이때 필요한 데이터를 적절할 형식으로 형변환하는 과정에 대해 설명한다.

송수신될 이미지는 Bitmap 객체에 저장해서 사용하는데, 이 Bitmap 객체(=이미지 데이터)를 네트워크상에 보낼때는 바이트형으로 형변환을 한다.

이때 비트맵을 바이트형으로 형변환하는 이유는 네트워크상에서 이미지를 전송하는 방법이 여러가지가 있겠지만 간단하게 Socket 클래스의 Send(), Receive() 메소드를 사용한다면 이 메소드의 매개변수인 데이터버퍼가 byte[]형이기 때문이다.

우선 위의 데모프로그램을 설명하면 서버/클라이언트 구조로 작동을 하는데 Sender쪽에서 서버의 역할로 자신의 컴퓨터 전체화면을 캡쳐해서 이미지를 전송하고, Receiver쪽에서는 그 이미지를 받아서 화면에 출력해준다.
(전체화면 캡쳐하는 방법은 이전 글 참조...(클릭))

다음은 비트맵 이미지와 바이트형간의 형변환을 하는 소스의 일부이다.

01 // Bitmap To byte[]
02 Bitmap bitmap; // 이미지가 저장된 bitmap객체
03 MemoryStream ms = new MemoryStream();
04 bitmap.Save(ms, ImageFormat.Png);
05 ms.Position = 0;
06 byte[] data = ms.ToArray();
07
08
09 // byte[] To Bitmap
10 byte[] data; // 전송된 이미지를 받은 버퍼
11 MemoryStream ms = new MemoryStream();
12 ms.Write(data, 0, (int)data.Length);
13 Bitmap bitmap = new Bitmap(ms);

소스를 보면 알겠지만 MemoryStream을 중간 매개체로 해서 간단하게 형변환을 한다.


먼저 비트맵을 바이트형으로 변환하는 소스(=Bitmap To byte[])부터 설명하겠다.

가장 위에 있는 bitmap 객체에 전송할 이미지 정보가 있다고 가정하고 이 이미지 정보를 메모리스트림에 저장한다. 그 이후에 메모리스트림의 ToArray()메소드를 이용해서 새로 생성한 byte[]형의 변수에 저장함으로써 형변환이 끝난다. 이렇게 형변환이 끝나면 최종 데이터인 data 변수를 Socket.Send() 메소드에 넣어줌으로써 이미지를 전송할 수 있다.


다음으로 바이트형을 비트맵으로 변환하는 소스(=byte[] To Bitmap)에 대해 설명하겠다.

Bitmap To byte[] 를 처리하는 과정과 거의 비슷한데, Socket.Receive()메소드를 통해서 전송된 이미지 정보를 data변수에 저장했다고 가정하고 이 데이터를 메모리스트림에 저장한다. 그 다음에 Bitmap 객체를 생성하면서 생성자에 메모리스트림 객체를 넣어줌으로써 간단히 형변환이 끝난다. 이렇게 형변환이 끝난 최종 데이터인 bitmap 객체를 이용해서 이미지 정보를 사용할 수 있다.

(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2008 / 3.5)

 

댓글