본문 바로가기

Win32 API

11. Win32 API - Bitmap

비트맵이란?

Win32 API(Bitmap)은 Windows 운영 체제에서 그래픽 처리를 위한 함수 및 구조체를 제공하는 API(응용 프로그램 프로그래밍 인터페이스)입니다.
비트맵(Bitmap)은 이미지 데이터를 저장하고 표시하는 데 사용되는 특별한 형식의 그림입니다. Win32 API에서는 비트맵을 다루기 위한 다양한 함수와 구조체가 제공됩니다.
비트맵을 사용하는 이유는 복잡한 그림을 프로그램 실행 중에 그리기보다는 비트맵에 저장해두고 사용하는 형식으로 활용합니다.

 

1. 비트맵 패턴 종류

 

DDB(Device Dependent Bitmap)

  • 장치 의존적 비트맵

DIB(Device Independent Bitmap)

  • 장치 비 의존적 비트맵

2. BitMap 구조체

https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmap

 

BITMAP (wingdi.h) - Win32 apps

The BITMAP structure defines the type, width, height, color format, and bit values of a bitmap.

learn.microsoft.com

 

typedef struct tagBITMAP {
  LONG   bmType;
  LONG   bmWidth;
  LONG   bmHeight;
  LONG   bmWidthBytes;
  WORD   bmPlanes;
  WORD   bmBitsPixel;
  LPVOID bmBits;
} BITMAP, *PBITMAP, *NPBITMAP, *LPBITMAP;

mType

비트 맵 유형입니다. 이 멤버는 0이어야합니다.

bmWidth

비트 맵의 너비 (픽셀)입니다. 너비는 0보다 커야합니다.

bmHeight

비트 맵의 높이 (픽셀)입니다. 높이는 0보다 커야합니다.

bmWidthBytes

각 스캔 라인의 바이트 수입니다. 시스템은 비트 맵의 비트 값이 단어 정렬 된 배열을 형성한다고 가정하기 때문에이 값은 2로 나눌 수 있어야합니다.

bmPlanes

컬러 평면의 수입니다.

bmBitsPixel

픽셀의 색상을 나타내는 데 필요한 비트 수입니다.

bmBits

비트 맵의 비트 값 위치에 대한 포인터입니다. 그만큼 bmBits 멤버는 문자 배열 (1 바이트) 값에 대한 포인터 여야합니다.

 

2. 비트맵의 비트 패턴에 접근하기

DDB 형식의 비트맵 생성 시 생성된 비트맵을 운영체제가 관리하게 됩니다.
비트맵 생성에 대한 요청이 발생하면 비트맵을 생성한 뒤 응용프로그램에는 HBITMAP 형식으로 핸들 값을 전달해줍니다 해당 비트맵을 사용하고 싶을 때 전달 받은 핸들 값으로 비트맵 관련 함수를 호출하도록 구성되어 있습니다.
운영체제가 관리 주체이다 보니, 비트 패턴을 변경하고 싶어도 비트 패턴이 존재하는 메모리의 주소를 알지 못해서 변경할 수 없습니다.

 

3. 비트 패턴의 크기 계산

비트맵의 비트 패턴을 복사해오거나 새로운 패턴을 비트맵의 비트 패턴에 설정하고 싶다면, 비트맵의 비트 패턴의 크기를 알아야 합니다. 비트 패턴 의 크기를 계산하려면 해당 비트맵의 폭 과 높이 그리고 1점의 색상 수 를 알아야 합니다.


비트 패턴 크기 계산

  • 폭이 300, 높이가 200, 32비트 색상
  • 300 * 200 = 60000개 점
  • 1점이 32비트(4byte)로 구성
  • 60,000 * 4 = 240,000bytes의 메모리고 구성되어 있습니다.
  • GDI 개념 ⇒ GetObject라는 함수를 사용해서 HBITMAP 핸들 값으로 비트맵의 폭 과 높이 그리고 색상 수 를 얻을 수 있습니다.

 

4. GetBitmapBits

  • 비트맵의 비트 패턴을 복사해오는 GetBitmapBits 함수
LONG GetBitmapBits(
  [in]  HBITMAP hbit,
  [in]  LONG    cb,
  [out] LPVOID  lpvBits
);

[in] hbit

디바이스 종속 비트맵에 대한 핸들입니다.

[in] cb

비트맵에서 버퍼로 복사할 바이트 수입니다.

[out] lpvBits

비트맵 비트를 받을 버퍼에 대한 포인터입니다. 비트는 바이트 값의 배열로 저장됩니다.

 

사용 예시

HBITMAP h_bitmap = CreateBitmap(300, 200, 1, 32, NULL);

unsigned int *p_pattern = new unsigned int[300 * 200];

int copy_size = GetBitmapbits(h_bitmap, 300 * 200 * 4, p_pattern);

delete[] p_pattern; // 메모리 해제
DeleteObject(h_bitmap); // 비트맵 제거

 

 

5. SetBitmapBits

  • 비트맵에 새로운 비트 패턴을 설정하는 함수
LONG SetBitmapBits(
  [in] HBITMAP    hbm,
  [in] DWORD      cb,
  [in] const VOID *pvBits
);

[in] hbm

설정할 비트맵에 대한 핸들입니다. 호환되는 DDB(비트맵)여야 합니다.

[in] cb

lpBits 매개 변수가 가리키는 바이트 수입니다.

[in] pvBits

지정된 비트맵에 대한 색 데이터가 포함된 바이트 배열에 대한 포인터입니다.

사용 예시

HBITMAP h_bitmap = CreateBitmap(300, 200, 1, 32, NULL);

unsigned int *p_pattern = new unsigned int[300 * 200];

for (int i = 0; i < 300 * 200; i++)
{
	*(p_pattern + i) = 0xFF0000FF;
}

int copy_size = SetBitmapBits(h_bitmap, 300 * 200 * 4, p_pattern);

// h_bitmap 사용 코드

delete[] p_pattern; // 메모리 해제
DeleteObject(h_bitmap); // 비트맵 제거

 

6. 참조

https://blog.naver.com/tipsware/220984197835

 

비트맵에 대하여

: Win32 프로그래밍 관련 전체 목차 http://blog.naver.com/tipsware/221059977193 1. 컴퓨터의 화면 출력...

blog.naver.com

 

'Win32 API' 카테고리의 다른 글

13. Win32 API - 윈도우 좌표  (0) 2024.03.09
12. Win32 API - 무효화 / 유효화 영역  (0) 2024.03.06
10. Win32 API - DC 개요  (0) 2024.02.24
9. Win32 API - GDI 개요  (0) 2024.02.24
8. Win32 API - 윈도우의 생성과 소멸  (0) 2024.02.24