안녕하세요. 벌써 하루가 꼴딱 지나가 버렸네요 -_- ㅋ
방학을 해서인지 하루종일 방에서 딩굴딩굴 거리다가 아차 포스팅 해야지 ! 하는 생각에 블로그에 접속했습니다.
원래 계획 대로라면 오늘 WPF와 XAML에 대한 내용으로 포스팅 할 계획 이였지만, 내일로 미루도록 하겠습니다.(죄송합니다 ㅜ_ㅡ;)
-----------------------------------------------------------------------------------------------
자 어쨋든 오늘 시간에 소개해 드릴 내용은 "C#을 사용해서 RawBitmap 파일을 여는 방법"입니다.
뭐 방법이야 수없이 많겠지만, (API를 쓴다 Bitmap으로 변환한다 등등등등) 이번에 소개해 드릴 방법은 순수(?)하게 .Net Framework에서 제공하는 기능만을 가지고 구현 하는 방법입니다.
별로 어려운 내용이 아니니 한라인 한라인 따라가시면 쉽게 이해 하실 수 있을겁니다.
먼저 코드를 보여드리면,

위와 같이 표현 할 수 있습니다.
이제 한줄 한줄 설명 들어가도록 하겠습니다.
Format24bppRgb,Format16bppRgb555,Format16bppRgb565 등 대략 20가지정도 되는 Format을 지원합니다.
자세한 정보는
http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat(VS.85).aspx
를 참고 하시기 바라며 계속 하겠습니다.
생성된 Bitmap 객체의 메모리를 독점 하하기 위해서 Bitmap객체 시스템 메모리를 잠그는 과정입니다.
LockBits 함수를 호출하면 BitmapData객체를 반환 하는데 이 객체를 사용해 Bitmap객체의 메모리에 접근 할 수 있습니다.
BitmapData의 자세한 정보는 아래 URL을 참고 하시기 바랍니다.
http://msdn.microsoft.com/ko-kr/library/system.drawing.imaging.bitmapdata(en-us,VS.85).aspx
그리고 unsafe 키워드를 사용해 포인터를 사용가능한 공간으로 설정합니다. 그리고 Bitmapdata의 Scan0 속성을 Pointer로 변환하여 Byte* 변수에 기록합니다.이후 RawData에 저장된 내용을 메모리에 기록하면 됩니다.
기록이 모두 완료되면 메모리 접근을 위해 잠갓던 것을 UnLockBits함수를 사용해 다시 해제 해줍니다.
그리고 맨 아랫줄 SetGrayscalePalette 함수는 8bit Image를 위해 필요한 색상 표로 24 bit image를 사용하시는 분들을 필요 없는 부분이며, 참고적으로 SetGrayscalePalette함수의 내용은 아래와 같습니다.

이상으로 이번 시간을 마치며, 질문이나 샘플 코드가 필요하신 분께서는 리플 달아주시면 올려드리도록 하겠습니다. 그럼 이만!
방학을 해서인지 하루종일 방에서 딩굴딩굴 거리다가 아차 포스팅 해야지 ! 하는 생각에 블로그에 접속했습니다.
원래 계획 대로라면 오늘 WPF와 XAML에 대한 내용으로 포스팅 할 계획 이였지만, 내일로 미루도록 하겠습니다.(죄송합니다 ㅜ_ㅡ;)
-----------------------------------------------------------------------------------------------
자 어쨋든 오늘 시간에 소개해 드릴 내용은 "C#을 사용해서 RawBitmap 파일을 여는 방법"입니다.
뭐 방법이야 수없이 많겠지만, (API를 쓴다 Bitmap으로 변환한다 등등등등) 이번에 소개해 드릴 방법은 순수(?)하게 .Net Framework에서 제공하는 기능만을 가지고 구현 하는 방법입니다.
별로 어려운 내용이 아니니 한라인 한라인 따라가시면 쉽게 이해 하실 수 있을겁니다.
먼저 코드를 보여드리면,
위와 같이 표현 할 수 있습니다.
이제 한줄 한줄 설명 들어가도록 하겠습니다.
public Bitmap CreateBitmap(int Width,int Height,Byte[][]RawData)함수 헤더 인데요, Bitmap 객체를 반환하고, 가로(Width),세로(Height), 그리고 실제 RawData가 저장되어있는 Byte 2차원 배열을 Parameter로 전달 받습니다.
Bitmap Canvas = new Bitmap(Width, Height,PixelFormat.Format8bppIndexed);그리고 입력 받은 크기에 맞는 빈 Bitmap객체를 생성합니다. 제가 가지고 있는 데이터가 8Bit Raw Image라 Pixel Format을 Format8bppIndexed로 지정 했지만, 상황에 맞는 PixelFormat을 지정하시면 됩니다.
Format24bppRgb,Format16bppRgb555,Format16bppRgb565 등 대략 20가지정도 되는 Format을 지원합니다.
자세한 정보는
http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat(VS.85).aspx
를 참고 하시기 바라며 계속 하겠습니다.
BitmapData CanvasData = Canvas.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
생성된 Bitmap 객체의 메모리를 독점 하하기 위해서 Bitmap객체 시스템 메모리를 잠그는 과정입니다.
LockBits 함수를 호출하면 BitmapData객체를 반환 하는데 이 객체를 사용해 Bitmap객체의 메모리에 접근 할 수 있습니다.
BitmapData의 자세한 정보는 아래 URL을 참고 하시기 바랍니다.
http://msdn.microsoft.com/ko-kr/library/system.drawing.imaging.bitmapdata(en-us,VS.85).aspx
그리고 unsafe 키워드를 사용해 포인터를 사용가능한 공간으로 설정합니다. 그리고 Bitmapdata의 Scan0 속성을 Pointer로 변환하여 Byte* 변수에 기록합니다.이후 RawData에 저장된 내용을 메모리에 기록하면 됩니다.
기록이 모두 완료되면 메모리 접근을 위해 잠갓던 것을 UnLockBits함수를 사용해 다시 해제 해줍니다.
그리고 맨 아랫줄 SetGrayscalePalette 함수는 8bit Image를 위해 필요한 색상 표로 24 bit image를 사용하시는 분들을 필요 없는 부분이며, 참고적으로 SetGrayscalePalette함수의 내용은 아래와 같습니다.
이상으로 이번 시간을 마치며, 질문이나 샘플 코드가 필요하신 분께서는 리플 달아주시면 올려드리도록 하겠습니다. 그럼 이만!
김대욱(kdw234@naver.com) http://kdw234.tistory.com

