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

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

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

이미지 송신측

이미지 수신측


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

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

// Bitmap To byte[]
Bitmap bitmap;	// 이미지가 저장된 bitmap객체
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Png);
ms.Position = 0;
byte[] data = ms.ToArray();


// byte[] To Bitmap
byte[] data;	// 전송된 이미지를 받은 버퍼
MemoryStream ms = new MemoryStream();
ms.Write(data, 0, (int)data.Length);
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 객체를 이용해서 이미지 정보를 사용할 수 있다.

Source: https://github.com/gungume/BlogSamples/tree/master/ImageTransport
(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2008 / 3.5)

Posted by Gungume
,