Blog | Tag | Local | Guest | Login | Write |  RSS
RAW에 해당되는 글 1건


 이번시간에는 Raw로 된 Image 파일을 Bitmap으로 바꾸는 방법에 대하여 포스팅을 하겠습니다.
 사실 이 내용은 제가 직접 구현했다기 보다는,, 잘 알고 있는 위대한 동생님꼐서 ㅋ
 저번 프로젝트를 하면서 알려주신 방법입니다. 

 그.아이 의 말에 의하면 여러가지 방법이 있다고 하는데, (API를 쓴다 Bitmap으로 변환한다 등등등등)
 이번에 소개해 드릴 방법은 순수(?)하게 .Net Framework에서 제공하는 기능만을 가지고 구현 하는 방법
 이라고 하더군요 쿨럭 ㄷㄷㄷ, ㅋ

   (  붙여넣기를 했더니 예쁘지 않아서 캡쳐해왔습니다-_-;;)

   코드가 어렵지않아서 그냥 코드만 보셔도 사실 무방할 것이라고 생각됩니다.
  설명 들어갑니다 ^^*

 함수의 헤더는 이런 형식을 띄고 있습니다. 

          public Bitmap RawToBitmap(int Width,int Height,Byte[][] RawData)

 기본적으로 비트멥을 생성하기 위해 필요하다고 생각되는 가로와 세로정보, 그리고 rawData를
 파라미터로 받아 오고 있습니다. 필요하다면 픽셀포멧도 파라미터로 넣는것도 괜찮다고 생각합니다만 ㅋ
 일단 구현 내용은 8bit의 흑백영상이기에 pass해 봅니다.

         Bitmap BitmapImage = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);

 비트맵을 생성하고 있습니다. 생성자에는 파라미터로 받은 가로,세로 정보와 함께 픽셀정보를 넣어줍니다.
 아까 설명한 대로 지금 사용하고 있는 raw이미지는 8bit의 흑백영상이기에 PixelFormat.Format8bppIndexed을
 사용하였지만, 필요에 따라 바꾸셔도 무방한 파라미터라고 보실 수 있습니다. 

 PixelFormat은 픽셀정보를 담은 구조체로 더 자세한 정보는 msdn에서 찾아보시기 바랍니다 ^^
 http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat(VS.85).aspx

           BitmapData BitmapImageData = BitmapImage.LockBits(new Rectangle(0, 0, Width, Height)
                                                , ImageLockMode.WriteOnly,, PixelFormat.Format8bppIndexed);

 방금 생성한 Bitmap 객체에 RawData를 읽어오기 앞서, 외부에서 이 Bitmap 메모리에 접근하지 않도록 하기위해 
 이 메모리를 Lock하는 과정입니다. 
 LockBits라는 함수를 사용하면 메모리를 독점할 수 있으며, BitmapData를 return하는데 
 이 return된 BitmapData를 사용하여 Bitmap객체의 메모리에 접근하여 사용할 수 있다고 합니다.

 BitmapData의 자세한 정보역시 msdn을 참고하여 알아봅시다.
 http://msdn.microsoft.com/ko-kr/library/system.drawing.imaging.bitmapdata(en-us,VS.85).aspx

           unsafe {}  
 unsafe 키워드를 사용합니다.
 이 코드공간 안에서는 C#에서 잘 사용하지 않는 포인터를 사용 할 수 있으며,
 자세한 내용은 다음에 포스팅 하도록 하겠습니다.

            byte* Pointer = (byte*)BitmapImageData.Scan0.ToPointer();

 BitmapImageData 객체를 이용하여 Bitmap객체의 메모리에 접근하기 위해  Scan0속성을 포인터로  받아옵니다.
 이 함수는 객체의 포인터를 리턴하며, 이 포인터를 이용하여 rawData의 내용을 BItmap 객체의 메모리에 기록하면 됩니다.
 뒤에 나오는 for문 코드는 rawData를 Bitmap객체의 메모리에 기록하는 내용입니다.

            BitmapImage.UnlockBits(BitmapImageData);

기록이 완료되면 다시 외부에서 Bitmap메모리에 접근할 수 있도록 UnLockBits함수를 사용해 다시 해제 해줍니다. 

            SetGrayscalePalette(BitmapImage);

 마지막으로 SetGrayscalePalette 함수를 사용하는데 이는  8bit Image를 위해 필요한 색상 표로
 24 bit image를 사용하시는 분들을 필요 없는 내용이며, rawData에 맞도록 변형하여 사용하시면 되는 부분입니다.
 내용은 다음과 같습니다. 

 


미관상 코드를 캡쳐해서 붙여놓았는데,
혹 필요하시다면 다음에서 복사해서 가시기 바랍니다. ^^*


 마지막으로, 
 저에게 이러한 멋진방법을 알려주신 레퍼런스는 이며,
 http://whatisthat.co.kr/54
 혹 질문이 있으신 분은 요기 말고 저기에 해주시기 바랍니다 ㅋㅋㅋ
 아주 친절한 답변이 있을거에요~~

 그럼 어디서 훔쳐온듯한 찝찝한 기분의 포스팅을 마치도록 하겠습니다. ㅋ