'Image Memory'에 해당되는 글 1건

  1. 2009/01/16 C# Image Processing Util Class (3)
C#2009/01/16 03:08

연이은 Image Processing과 관련된 포스팅입니다.. (카테고리를 하나 만들어야하나..) 이번시간에 소개해 드릴 내용은 이전 시간과 마찬가지로 기술이라기 보다는 평소 C#을 사용해서 이미지 프로세싱을 할때 이미지로부터 메모리로 접근하기 위해서 자주 만들어 사용하던 클래스를 소개하는 시간이 되겠습니다. C#에서는 이미지를 제어하기 위해서 Image라는 클래스를 제공합니다. 그리고 사용자가 임의로 이미지 자체의 메모리를 조작 할 수 있도록 하는 메서드가 포함된 Bitmap이라는 Class를 제공합니다.

Image Processing을 하는데 있어서 직접 Binary Data를 읽어들여서 처리하는 방법도 있지만, RAW나 BMP형식이 아니라 JPG나 PNG라면.. 직접 디코딩하는 작업을 생각만해도 끔찍합니다.. ㅎㅎ 이럴때 Bitmap Class를 사용하면 매우 쉽고 유용하게 사용할 수있습니다. 기본적으로 Bitmap Class에서는 기본적으로 BMP,JPG, GIF, PNG, TIF등의 이미지를 지원하는 인코더와 디코더가 달려있어서 FromFile메서드를 통해 쉽게 불러오고 Save메서드를 사용해 반대로 저장할수 있는 기능을 제공합니다. (Win32 Bitmap Handle도 지원합니다.)

이렇게 불러들인 이미지 파일을 처리 하기 위해서는 이미지가 저장된 메모리로의 접근이 필수적인데요, 간단 몇 픽셀 정도는 GetPixel 또는 SetPixel메서드를 통해 쉽게 픽셀 데이터를 처리 할 수 있지만, 이미지 전체를 처리하기에는 터무니 없는 속도때문에 적합하지 않습니다.

그렇다면 이미지 전체를 처리하기위해서는 어떻게 해야할가요.. Bitmap Class에서는 LockBits와 UnLockBits메서드를 사용해 메모리에 접근 할 수 있습니다. 사용법은 아래와 같습니다.


간단하지만, 뭔가 어려워 보이는 코드입니다. (위 코드가 손에 익숙해지면 큰 부담은 없겠지만.. 손에 익기 전까지는 꾀나 번거러운 작업이 됩니다..) 그래서 이와 같은 코드를 좀더 쉽게 사용하기 위해서 아래와 같은 클래스를 만들어 보았습니다.


위 코드에서는 Bitmap Class에 몇가지 확장메서드를 추가하여 손쉽게 이미지로부터 메모리를 가져오고 반환하는 작업이 가능합니다. 아래는 사용 예입니다.


어떠신가요? 처음 코드보다는 한결 간단해진것을 확인 하실 수 있으실것입니다. 기본적으로 LockMemory를 호출하게되면 이미지 전체 영역에 대한 메모리를 반환하지만, 영역을 지정할 경우 해당영역에서만 사용가능한 메모리를 리턴합니다. (부분적인 처리가 필요하다면 유용하겠죠..) 그리고 이미지 자체의 메모리를 Byte배열에 복사를 하고자 한다면 CopyMemory를 호출하여 쉽게 복사 할 수 도 있습니다.

질문이나 기타 궁금하신 사항은 리플이나 이메일로 남겨주세요~
(확장 메서드에 대해서 질문 하셨던 분이 있어서 다음 포스팅에서는 확장메서드에 대해서 다루도록 하겠습니다.)


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스