(2022) 공부 (Study)/게임 개발 (Development)

[Win32API] Bitmap에 대한 정리 (1) - Bitmap 구조 및 역할

수낭 2022. 4. 16. 23:37

DibSection( ), DDB(Dependent), DIB(Independent), 
Bitmap Stride(Multiple of 4), bitCount, 등, 비트맵의 세부 구조를 변경하는 메모리 실습을 하는데에
필요했던 정보들을 모아놓았다.

 

포스팅을 읽기 전에 참고하면 좋은 자료.

https://docs.microsoft.com/ko-kr/windows/win32/learnwin32/windows-coding-conventions

 

Windows 코딩 규칙 - Win32 apps

Windows 프로그래밍을 처음 접하는 경우 Windows 프로그램을 처음 볼 때 이 프로그래밍이 방해가 될 수 있습니다.

docs.microsoft.com

 

Bitmap에 대한 유용한 자료들을 제공해준 사이트들.

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=tipsware&logNo=220986173576 

 

Bitmap과 GDI 그리고 DC (Feat. GDI Object)

한동안 제가 비트맵에 대한 블로깅을 참 많이 했는데, 그 이유가 바로 GDI와 DC를 설명하려고 했던 것...

blog.naver.com

 

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

 

CreateCompatibleDC 함수에 대하여

1. DC를 만드는 또 다른 방법 화면에 그림을 그리고 싶다면 DC를 먼저 얻어야 합니다. 보통의 경우에는...

blog.naver.com

 

https://programmer.group/introduction-to-audio-and-video-04-bmp-image-four-byte-alignment.html

 

Introduction to Audio and Video-04-BMP Image Four-byte Alignment

Introduction to Audio and Video-04-BMP Image Four-byte Alignment Keywords: C++ Directory of Audio and Video Introduction Articles Four-byte alignment of BMP images The bits representing the pixels in BMP bitmaps are aligned in action units, and the size of

programmer.group

 

https://m.blog.naver.com/PostView.naver?blogId=hanulnam&logNo=10005345124&proxyReferer= 

 

GDI+ BitmapData의 stride에 대해서 질문입니다.

전문Q&A > 컴퓨터, 통신 > 데브피아 > 프로그래밍 > C# 인쇄하기 | 지식 선물하기 GD...

blog.naver.com

 

https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader

 

BITMAPINFOHEADER (wingdi.h) - Win32 apps

The BITMAPINFOHEADER structure contains information about the dimensions and color format of a device-independent bitmap (DIB).

docs.microsoft.com

 

https://m.blog.naver.com/ontow/140118496287

 

Bitmap 파일 비트 수 변환 32bit to 24bit

32비트와 24비트의 차이는 알파채널이 있는가의 차이이므로, 실질적인 색상의 차이는 없다. (3바이트) 그러...

blog.naver.com

 

https://en.m.wikipedia.org/wiki/BMP_file_format

 

BMP file format - Wikipedia

Microsoft has defined a particular representation of color bitmaps of different color depths, as an aid to exchanging bitmaps between devices and applications with a variety of internal representations. They called these device-independent bitmaps or DIBs,

en.m.wikipedia.org

 

https://stackoverflow.com/questions/7502588/createcompatiblebitmap-and-createdibsection-memory-dcs

 

CreateCompatibleBitmap and CreateDIBSection (Memory DC's)

from what I've read here it seems that most of the Windows GDI functions are accelerated. So for instance a call to BitBlt or AlphaBlend uses hardware acceleration if available. It also mentions th...

stackoverflow.com

 

https://stackoverflow.com/questions/31608867/about-bmp-file-how-can-i-write-change-a-pixel-color-in-c

 

About BMP file. How can i write/change a pixel color? (in C)

I'm trying to change a pixel from a picture (format bmp, 24 bits). I have this 3 structures: for file header: #pragma pack(2) typedef struct { unsigned short int typeID; unsigned int size; unsig...

stackoverflow.com

 

http://hyeongjin-kim.blogspot.com/2013/05/ddb-dib.html?m=1 

 

비트맵의 종류(DDB, DIB)

윈도우즈가 지원하는 비트맵 포맷 두 가지 1. DDB(Device Dependent Bitmap) 2. DIB(Device Independent Bitmap) DDB의 특징 1. 윈도우즈 3.0 이전 버전에서 사용 2. 출력 장치에 의존족...

hyeongjin-kim.blogspot.com

 

https://hubbleconstant.tistory.com/m/40

 

비트맵의 구조, 24비트 비트맵의 구조는 어떻게 될까?

오늘은 24비트 비트맵에 대해서 알아보려고 합니다. 24비트 비트맵에 24는 한 픽셀에 표현되는 bit 수를 의미합니다. 즉, 24비트 비트맵은 한 픽셀을 24bit(3byte)로 표현을 한 것입니다. 8비트 비트맵

hubbleconstant.tistory.com

 

https://yongho1037.tistory.com/m/284

 

[최종프로젝트] BITMAP 분석

Bitmap에 관하여 이번에는 BITMAP에 대해서 철저하게 까보자. BITMAP은 Window에서 폭넓게 사용하는 이미지형식으로써 데이터한개단위당 픽셀한개로 이루어진 간단한(과연 간단할까?) 이미지형식이다.

yongho1037.tistory.com

 

https://m.cafe.daum.net/smhan/dT3V/26

 

bmp파일을 읽어 raw 데이터를 추출한 후 dc 화면에 그리기

1. bmp 파일을 읽어서 raw 데이터 입력한다.사용예) #define WIDTHBYTES(bits) (((bits)+31)/32*4) // 4바이트 배수BYTE *m_pImgBuff = NULL;CClientDC dc(this);LoadBMPIntoDC(dc, "test.bmp");bool LoadBMPIntoDC ( HDC hDC,

m.cafe.daum.net

 

https://docs.microsoft.com/en-us/windows/win32/gdi/bitmaps

 

Bitmaps (Windows GDI) - Win32 apps

A bitmap is a graphical object used to create, manipulate (scale, scroll, rotate, and paint), and store images as files on a disk. This overview describes the bitmap classes and bitmap operations.

docs.microsoft.com

 

https://m.blog.naver.com/yeonsu1936/222023028283

 

[프로젝트 | 자료조사] BMP 파일 구조

BITMAP 이미지 구분 1. /0x42/0x4D/ -> BM 확인 2. BfReserved 1/2 -> 0 확인 2개의 차이...

blog.naver.com

 

https://thebook.io/006796/

 

더북(TheBook): Visual C++ 영상 처리 프로그래밍

 

thebook.io

영상 처리 프로그래밍이이라는 것이 Win32API 게임 개발과, bitmap에 대한 자료도 많이 함유되어 있는 것 같다.
영상 처리가 게임 개발과 매우 밀접하다는 것을 알았다.

 

추후 bmp 영상을 화면에 출력하는 프로젝트를 진행하는 경우에도,
BMP 파일에 대해 이해를 하고 있어야 한다. (bmp 파일은 영상 출력 프로그래밍 실습에도 자주 쓰인다.)

 

색상 테이블(팔레트) 이란?

256개 이하의 색상을 사용하는 비트맵은 BITMAPINFOHEADER 뒤에 RQBQUAD 구조체의 배열로 구성된 색상 테이블color table이 존재한다. 색상 테이블은 비트맵에서 사용되는 색상 정보를 담고 있는 영역으로 palette(팔레트) 라고도 한다. RGBQUAD 구조체는 다음과 같은 형태로 정의되어 있다.

typedef struct tagRGBQUAD {
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
} RGBQUAD;

BYTE unsigned char와 동일한 자료형으로써, 1바이트의 크기를 갖는다. 그러므로 RGBQUAD 구조체의 크기는 4바이트이다. 멤버 이름을 보면 쉽게 알 수 있듯이, rgbBlue는 파란색, rgbGreen은 녹색, rgbRed는 빨간색 색상 정보를 표현한다. 마지막 1바이트 rgbReserved는 사용하지 않고 있으며, 항상 0으로 표현한다. 구조체의 이름은 RGBQUAD이지만 실제 색상이 저장되는 순서는 RGB 순서가 아니라 BGR 순서인 것을 명심해야 한다. (대부분 리틀엔디안 체계이기 때문이다.)

 그림 : 그레이스케일 비트맵 예제 파일(gray.bmp)

이 비트맵은 각각의 가로줄의 그레이스케일 값이 각각 64, 128, 192, 255로 구성되어 있고
4*4 행렬로 구성된, 간단한 비트맵 파일이다.

Grayscale 비트맵 파일은 256개의 RGBQUAD 배열이 존재하며, 각각의 원소에는 rgbBlue, rgbGreen, rgbRed 값이 동일한 값으로 설정되어 있다. 그레이스케일 비트맵 파일에서 팔레트는 검정색에 해당하는 (0, 0, 0, 0)부터 시작하여 흰색에 해당하는 (255, 255, 255, 0)까지 차례대로 밝기 값이 증가하도록 설정되어 있다. 즉, 그레이스케일 BMP 파일은 회색조의 고정된 형태의 색상 테이블을 가지는 256 색상 BMP 파일의 특별한 형태라고 말할 수 있다.

TRUE COLOR 비트맵 파일은 palette가 존재하지 않는다. 트루컬러 영상에서 표현 가능한 색상 수가 224=16,777,216이기 때문에 팔레트를 만드는 것 자체가 BMP 파일 용량에 무리를 줄 수 있기 때문이다.

 

Bitmap 이란?

비트맵(BMP)은 컴퓨터에서 영상을 표현하는 대표적인 방법이다.
사용시 단순히 그림을 복사하여 화면에 보여주기 때문에 벡터를 이용한 방식보다 빠르다.
windows에서 지원하는 비트맵은 두 가지가 있다.

1. 장치 의존 비트맵(Device Dependent Bitmap) DDB
2. 장치 독립 비트맵(Device Independent Bitmap) DIB
이 중 영상처리에서는 DIB를 사용한다. 

그 이유는 출력장치가 달라지더라도 어디에서나 비트맵이 출력되기 때문이다. 이는 DIB에 자신의 색상을 표현하는 색상 테이블이 있기 때문이다.
*참고 : 비트가 모여서 픽셀, 픽셀이 모여서 영상 및 이미지을 구성한다.

 

BMP 파일

BMP 파일은 확장자가 .bmp인 파일을 이야기 하며, 다른 영상 파일 형식과 달리 압축을 하지 않고 DIB구조를 그대로 파일로 저장한 형태이다.

 

BMP 파일 구조

구조는,
- 비트맵 파일 헤더(BITMAPFILEHEADER) : BMP 파일 자체에 대한 정보를 담고 있는 영역,
- 비트맵 정보 헤더(BITMAPINFOHEADER) : 비트맵 영상의 크기, 색상 수 등에 대한 정보를 담고 있는 영역,
- 색상 테이블(팔레트) : 비트맵의 영상의 색상 정보를 담고 있는 부분,
비트맵의 색상 수에 따라 색상 테이블이 존재하지 않을 수도 있다.
- 픽셀 데이터 : 각 픽셀의 색상 정보를 표현하는 공간(각 픽셀마다 3바이트를 사용해 BGR 표현)
의 4가지로 구성 되어있다.

 

BITMAPINFOHEADER 구조체, 색상 테이블, 픽셀 데이터 부분을 합쳐 packed-DIB 포맷이라고 부르며 단순히 DIB구조라고 부르기도 한다.

BMP 파일 구조 중 색상 테이블 부분은 비트맵 파일의 속성에 따라 존재하지 않을 수도 있다고 했는데,
BMP 파일의 영상이 가지고 있는 색상이 256 색상 이하이면, 즉 생상 수가 2, 16, 256개인 경우에는 색상 테이블이 존재한다.
이와 달리 2의 24승 가지 색상을 표현할 수 있는 트루컬러 영상에는 색상 테이블 정보가 존재하지 않아 비트맵 정보 헤더 뒤에 픽셀 데이터 정보가 나타난다.(용량이 너무 크기 때문에)

그레이스케일 영상의 BMP 파일에는 256단계 무채색을 표현하는 RGBQUAD 배열이 저장되어있다. RGBQUAD 구조체 하나의 크기가 4바이트이므로 그레이 스케일 비트맵의 색상 테이블 영역의 크기는 256*4=1024바이트이다.

픽셀 데이터 부분에는 각 픽셀의 그레이스케일을 표현하는 RGBQUAD 배열의 인덱스가 저장되어 있다.
각각의 BMP파일 구조체에 대한 내용의 정의는 너무 많아서 필요한 정보를 검색해서 얻는 것이 좋다고 생각한다.

일반적으로 비트맵은 상하가 뒤집힌 상태로 저장된다.
BitmapInfoHeader 구조체의 biheight가 양수로 저장되기 때문에 항상 뒤집힌 상태라고 생각해도 무방하다.
또한 효율적인 데이터 관리를 위해 영상의 가로 크기를 4의 배수로 저장한다. 예를들어 영상의 크기가 3x3이라 하더라도
실제로는 여분의 크기 1바이트를 추가해 4x3를 사용한다.