BMP 파일 포맷
1. 개요
BMP 파일 포맷은 비트맵 이미지 파일을 저장하기 위한 파일 형식으로, 파일 헤더, DIB 헤더, 색상 팔레트, 비트맵 데이터로 구성된다. 파일 구조는 비트맵 파일 헤더와 DIB 헤더를 포함하며, 색상 팔레트와 픽셀 배열을 선택적으로 포함한다. BMP 파일은 다양한 픽셀 형식을 지원하며, 무압축 또는 RLE 압축 방식을 사용할 수 있다. 윈도우와 OS/2 플랫폼에서 기본 이미지 형식으로 사용되며, 단순하고 개방적인 특성으로 인해 다양한 운영 체제에서 널리 지원된다.
이미지 준비중입니다.
| 파일 확장자 | .bmp, .dib |
|---|---|
| 마임 유형 | image/bmp, image/x-bmp |
| 유형 코드 | 'BMP ', 'BMPf', 'BMPp' |
| 유니폼 타입 | com.microsoft.bmp |
| 장르 | 래스터 그래픽스 |
| 공개 여부 | WMF용 OSP |
| 개발사 | 마이크로소프트 |
| 종류 | 비트맵이미지 |
|---|---|
| 자유 여부 | 예 |
-
마이크로소프트 윈도우 멀티미디어 기술 -
윈도우 디스플레이 드라이버 모델
윈도우 비스타부터 도입된 윈도우 디스플레이 드라이버 모델(WDDM)은 성능 향상, 안정성, 새로운 기술 지원을 목표로 개발된 디스플레이 드라이버 아키텍처로, 가상화된 비디오 메모리, GPU 스케줄링, 프로세스 간 Direct3D 표면 공유, 향상된 오류 허용성 등의 특징을 가지며 데스크톱 윈도우 관리자(DWM)를 통한 합성 데스크톱 환경 구현에 필수적이다. -
마이크로소프트 윈도우 멀티미디어 기술 -
윈도우 미디어 플레이어
윈도우 미디어 플레이어는 마이크로소프트에서 개발하여 윈도우 운영 체제에서 오디오, 비디오, 이미지 파일을 재생하는 데 사용되는 미디어 플레이어 응용 프로그램으로, 초기 버전은 '미디어 플레이어'라는 이름으로 출시되어 다양한 기능 추가 및 플랫폼 확장을 거쳤으나 현재는 대부분 지원이 중단되었고, 유럽 연합 경쟁법 위반 사건으로 인해 없는 버전도 출시되었다. -
그래픽 파일 포맷 -
JPEG
JPEG은 정지 화상의 디지털 압축 및 코딩을 위한 국제 표준이자 이를 만든 위원회의 이름으로, 1992년 최초 표준 발표 이후 웹 환경에서 널리 사용되는 이미지 형식이 되었다. -
그래픽 파일 포맷 -
FITS
FITS는 천문학 데이터를 저장하고 교환하기 위해 설계된 디지털 파일 형식으로, 이미지와 표 형식의 데이터를 지원하며, 국제천문연맹에서 관리한다.
2. 파일 구조
BMP 파일은 일반적으로 다음과 같은 구조를 가진다.
| BMP 헤더 | BMP 파일에 대한 일반 정보를 담고 있다. |
| 비트맵 정보(DIB 헤더) | 비트맵 그림에 대한 자세한 정보를 담고 있다. |
| 색 팔레트 | 인덱스 컬러 비트맵에 쓰이는 색의 정의를 담고 있다. |
| 비트맵 데이터 | 화소 대 화소 단위의 실제 그림을 담고 있다. |
그림 1은 비트맵 이미지 파일의 구조를 보여준다. 마이크로소프트는 다양한 색상 깊이를 가진 컬러 비트맵의 특정 표현 방식을 정의하여, 장치와 응용 프로그램 간에 비트맵 교환을 용이하게 했다. 이를 장치 독립 비트맵(DIB)이라고 하며, 해당 파일 형식은 DIB 파일 형식 또는 BMP 이미지 파일 형식이라고 불린다.
마이크로소프트 지원에 따르면, 장치 독립 비트맵(DIB)은 다양한 색상 해상도에서 비트맵을 정의하는 데 사용되며, 비트맵을 한 장치에서 다른 장치로 이동할 수 있도록 하는 것이 주요 목적이다. DIB는 일반적으로 메타 파일, BMP 파일, 클립보드 등에서 전송된다.
BMP 파일은 고정 크기 구조(헤더)와 가변 크기 구조로 구성되며, 오랜 기간 발전하면서 여러 버전의 구조가 파일에 나타날 수 있다.
비트맵 파일은 다음 구조로 구성된다.
메모리에 로드된 비트맵 이미지는 DIB 데이터 구조가 되며, 이는 Windows GDI API의 중요한 구성 요소이다. 메모리 내 DIB 데이터 구조는 BMP 파일 형식과 거의 동일하지만, 파일 헤더를 포함하지 않고 DIB 헤더로 시작한다.
2.1. 파일 헤더
BMP 파일 형식에서 파일 헤더는 파일의 맨 앞에 위치하며, 파일에 대한 기본적인 정보를 담고 있다. 이 헤더는 14바이트 크기로 고정되어 있으며, 다음과 같은 정보를 포함한다.
파일 헤더의 첫 2바이트는 항상 'BM'이라는 매직 넘버 (0x42 0x4D)로, 해당 파일이 BMP 파일임을 나타낸다. 예약 영역은 일반적으로 사용되지 않으며, 이미지를 생성하는 프로그램에 따라 다른 값을 가질 수도 있지만 보통은 0으로 설정되어 있다. 파일 크기와 오프셋 정보는 리틀 엔디안 형식으로 저장된다.
파일 헤더는 크게 BITMAPFILEHEADER와 BITMAPFILEHEADER2 두 가지 주요 버전으로 나뉜다.
2.1.1. BITMAPFILEHEADER
BITMAPFILEHEADER는 14바이트 크기의 비트맵 파일 헤더이다. 파일 시작 부분에 위치하며, 파일을 식별하고 관련 정보를 제공하는 데 사용된다. 일반적인 응용 프로그램은 이 헤더를 먼저 읽어 파일이 BMP 파일인지, 손상되지는 않았는지 확인한다.
| 16진수 오프셋 | 10진수 오프셋 | 크기 | 용도 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 0 | 2 바이트 | BMP 및 DIB 파일을 식별하는 데 사용되는 헤더 필드는 16진법으로 `0x42 0x4D`이며, ASCII에서 `BM`과 같다. 가능한 값은 다음과 같다. |
| BM | Windows 3.1x, 95, NT, ... 등 |
| BA | OS/2 구조 비트맵 배열 |
| CI | OS/2 구조 색상 아이콘 |
| CP | OS/2 const 색상 포인터 |
| IC | OS/2 구조 아이콘 |
| PT | OS/2 포인터 |
정수 값은 모두 리틀 엔디안 형식(최하위 바이트 우선)으로 저장된다.
2.1.2. BITMAPFILEHEADER2
OS/2 2.x에서 사용된 파일 헤더이다. BITMAPFILEHEADER를 확장한 것이지만 크기는 같다.
* 모노크롬 아이콘, 모노크롬 포인터는 1bit 모노크롬 이미지만 지원한다.
* 컬러 아이콘, 컬러 포인터는 1 파일 내에 투명 위치를 나타내는 1bit 모노크롬 이미지와 컬러 정보를 나타내는 이미지를 함께 가지는 특수한 파일 구조를 하고 있다.
2.2. 정보 헤더
정보 헤더는 비트맵 이미지에 대한 자세한 정보를 담고 있으며, 14바이트부터 시작한다. 이 블록은 애플리케이션이 이미지를 화면에 표시하는 데 필요한 정보를 제공하며, 윈도우 및 OS/2에서 내부적으로 사용되는 헤더와도 일치한다. 여러 가지 변형이 존재하며, 모두 크기를 지정하는 dword(32비트) 필드를 포함하여 어떤 헤더가 사용되었는지 쉽게 확인할 수 있다.
마이크로소프트는 DIB 형식을 여러 번 확장했기 때문에 다양한 버전의 정보 헤더가 존재한다. 새로운 확장 헤더는 이전 헤더 대신 일부 GDI 함수와 함께 사용하여 더 많은 기능을 제공할 수 있다.
| 크기 | 헤더 이름 | OS 지원 | 기능 | 작성자 |
|---|---|---|---|---|
| 12 | 윈도우 2.0 이상 OS/2 1.x | |||
| 64 | OS/2 2 | 하프토닝 추가. RLE 및 허프만 1D 압축 추가. | ||
| 16 | ||||
| 40 | 윈도우 NT, 3.1x 이상 | 비트맵 너비 및 높이를 4바이트로 확장. 16 bpp 및 32 bpp 형식 추가. RLE 압축 추가. | ||
| 52 | 문서화되지 않음 | RGB 비트 마스크 추가. | 어도비 포토샵 | |
| 56 | 알파 채널 비트 마스크 추가. | 어도비 포토샵 | ||
| 108 | 윈도우 NT 4.0, 95 이상 | 색상 공간 유형 및 감마 보정 추가. | ||
| 124 | Windows NT 5.0, 98 이상 | ICC 색상 프로파일 추가. | GIMP |
2.2.1. BITMAPCOREHEADER
OS/2 V1 헤더는 OS/2 비트맵에 사용되는 정보 헤더로, 크기는 12바이트이다. 'core 헤더'라고도 불린다.
| 오프셋 | 크기 | 저장하는 정보 | 값 · 비고 |
|---|---|---|---|
| 0x000e | 4바이트 | 헤더 크기 | 12 |
| 0x0012 | 2바이트 | 비트맵의 가로 폭 | 단위는 픽셀 |
| 0x0014 | 비트맵의 세로 폭 | ||
| 0x0016 | 플레인 수 | 항상 1 | |
| 0x0018 | 1 픽셀당 비트 수 | 1, 4, 8, 24 |
OS/2 V1 비트맵은 압축할 수 없으며 한 화소에 16/32 비트의 정보를 담을 수 없다. 모든 값은 부호 없는 정수이다.
Windows 2.x BITMAPCOREHEADER는 이미지 너비 및 높이 필드가 부호 없는 정수가 아닌 부호 있는 정수라는 점에서 OS/2 1.x BITMAPCOREHEADER와 다르다.
2.2.2. BITMAPINFOHEADER
윈도우 비트맵에서 사용되는 40바이트 크기의 정보 헤더로, 'info 헤더'라고도 불린다. 가장 널리 사용되는 형식이다. 호환성을 위해 대부분의 응용 프로그램은 파일을 저장할 때 오래된 DIB 헤더를 사용한다. OS/2가 물러나자, 현재 일반적으로 쓰이는 포맷은 V3 헤더가 되었다.
압축 방식 (바이트 #30-33)은 다음의 값을 가진다. BI_RGB 비트맵의 경우 그림 크기 필드는 0이 될 수 있다.
| 값 | 식별자 | 압축 방식 | 비고 |
|---|---|---|---|
| 0 | BI_RGB | 없음 | 가장 일반적 |
| 1 | BI_RLE8 | RLE 8비트/픽셀 | 8비트/픽셀 비트맵에만 사용할 수 있다. |
| 2 | BI_RLE4 | RLE 4비트/픽셀 | 4비트/픽셀 비트맵에만 사용할 수 있다. |
| 3 | BI_BITFIELDS | 비트 필드 | 16, 32비트/픽셀 비트맵에만 사용할 수 있다. |
| 4 | BI_JPEG | JPEG | 비트맵은 JPEG 이미지를 포함한다. |
| 5 | BI_PNG | PNG | 비트맵은 PNG 이미지를 포함한다. |
| 6 | BI_ALPHABITFIELDS | RGBA 비트 필드 마스크 | Windows CE 5.0만 .NET 4.0 이상 |
| 11 | BI_CMYK | 없음 | Windows 메타파일 CMYK만 |
| 12 | BI_CMYKRLE8 | RLE-8 | Windows 메타파일 CMYK만 |
| 13 | BI_CMYKRLE4 | RLE-4 | Windows 메타파일 CMYK만 |
info 헤더라고 불리는, 윈도우 비트맵에서 사용되는 정보 헤더는 다음과 같다.
| 오프셋 | 크기 | 저장하는 정보 | 값・비고 |
|---|---|---|---|
| 0x000e | 4바이트 | 헤더 크기 | 40 |
| 0x0012 | 비트맵의 가로 폭 | 단위는 픽셀 | |
| 0x0016 | 비트맵의 세로 폭 | 단위는 픽셀. 값이 음수인 경우는 톱다운 이미지가 된다 | |
| 0x001a | 2바이트 | 플레인 수 | 항상 1 |
| 0x001c | 1픽셀당 비트 수 | 0, 1, 4, 8, 16, 24, 32 | |
| 0x001e | 4바이트 | 압축 형식 | 0, 1, 2, 3, 4, 5 |
| 0x0022 | 이미지 데이터 크기 | 단위는 바이트 | |
| 0x0026 | 수평 방향의 해상도 | 단위는 픽셀/m | |
| 0x002a | 수직 방향의 해상도 | ||
| 0x002e | 사용하는 색상 수 | 비트맵에서 실제로 사용하는 컬러 팔레트 내의 컬러 인덱스 수. | |
| 0x0032 | 중요한 색상 수 | 비트맵을 표시하기 위해 필요한 컬러 인덱스 수. |
2.2.3. BITMAPINFOHEADER2
OS/2 V2 이후에 대응하는 정보 헤더로, 크기는 가변적이며 최대 64바이트이다.
| 오프셋 | 크기 | 저장하는 정보 | 값·비고 |
|---|---|---|---|
| 0x000e | 4 바이트 | 헤더 크기 | 16 ~ 64 (가변 길이) |
| 0x0012 | 비트맵의 가로 폭 | 단위는 픽셀 | |
| 0x0016 | 비트맵의 세로 폭 | ||
| 0x001a | 2바이트 | 플레인 수 | 항상 1 |
| 0x001c | 1 픽셀당 비트 수 | 1, 4, 8, 24 | |
| 0x001e | 4바이트 | 압축 형식 | 0 (비압축), 1 (8비트 RLE), 2 (4비트 RLE), 3 (1비트 허프만 코딩 압축), 4 (24비트 RLE) |
| 0x0022 | 이미지 데이터 크기 | 단위는 바이트. 비압축의 경우 0을 넣어도 됨 | |
| 0x0026 | 수평 방향의 해상도 | 단위는 "해상도의 단위"로 지정됨 | |
| 0x002a | 수직 방향의 해상도 | ||
| 0x002e | 사용 색상 수 | 비트맵에서 실제로 사용하는 컬러 팔레트 내의 컬러 인덱스 수. | |
| 0x0032 | 중요한 색상 수 | 비트맵을 표시하는 데 필요한 컬러 인덱스 수. | |
| 0x0036 | 2바이트 | 해상도 단위 | 0 (픽셀/m) |
| 0x0038 | 예약 영역 | 항상 0 | |
| 0x003a | 기록 방식 | 0 (바텀 업) | |
| 0x003c | 하프톤 방식 | 0 (하프톤 없음), 1 (오차 확산), 2 (PANDA), 3 (Super Circle) | |
| 0x003e | 4바이트 | 하프톤 시의 매개변수 1 | |
| 0x0042 | 하프톤 시의 매개변수 2 | 오차 확산의 경우 무시됨 | |
| 0x0046 | 부호화 방식 | 0 (RGB2, RGBQUAD에 해당) | |
| 0x004a | 식별자 | 애플리케이션이 독자적으로 사용해도 되는 영역 |
2.2.4. BITMAPV3INFOHEADER
어도비 포토샵(Adobe Photoshop)에서 사용되던 정보 헤더이다. info 헤더에 RGB와 α(알파) 성분의 컬러 마스크를 통합한 56바이트 헤더로, 편의상 V3 헤더라고 불린다. info 헤더에 RGB 성분의 컬러 마스크를 통합한 52바이트의 정보 헤더도 존재하며, 이쪽은 편의상 V2 헤더라고 불린다.
2.2.5. BITMAPV4HEADER
Windows영어 95, Windows NT영어 4.0부터 지원하는 정보 헤더이다. V4 헤더라고 불린다.
| 오프셋 | 크기 | 저장하는 정보 | 값・비고 |
|---|---|---|---|
| 0x000e | 4 바이트 | 헤더 크기 | 108 |
| 0x0012 | 4 바이트 | 비트맵의 가로 폭 | info 헤더와 동일 |
| 0x0016 | 4 바이트 | 비트맵의 세로 폭 | |
| 0x001a | 2 바이트 | 플레인 수 | |
| 0x001c | 2 바이트 | 1 픽셀당 비트 수 | |
| 0x001e | 4 바이트 | 압축 형식 | |
| 0x0022 | 4 바이트 | 이미지 데이터 크기 | |
| 0x0026 | 4 바이트 | 수평 방향의 해상도 | |
| 0x002a | 4 바이트 | 수직 방향의 해상도 | |
| 0x002e | 4 바이트 | 사용 색상 수 | |
| 0x0032 | 4 바이트 | 중요한 색상 수 | |
| 0x0036 | 4 바이트 | 빨강 성분 컬러 마스크 | |
| 0x003a | 4 바이트 | 녹색 성분 컬러 마스크 | |
| 0x003e | 4 바이트 | 파랑 성분 컬러 마스크 | |
| 0x0042 | 4 바이트 | α 성분 컬러 마스크 | |
| 0x0046 | 4 바이트 | 색 공간 | 0 (헤더 내에서 정의) |
| 0x004a | 36 바이트 | CIEXYZTRIPLE 구조체 | 색 공간이 0인 경우에만 유효 |
| 0x006e | 4 바이트 | 빨강 성분 감마 값 | 색 공간이 0인 경우에만 유효 16.16 고정 소수점 수 |
| 0x0072 | 4 바이트 | 녹색 성분 감마 값 | |
| 0x0076 | 4 바이트 | 파랑 성분 감마 값 |
2.2.6. BITMAPV5HEADER
윈도우 98, 윈도우 2000부터 지원하는 정보 헤더로 V5 헤더라고 불린다.
| 오프셋 | 크기 | 저장 정보 | 값 · 비고 |
|---|---|---|---|
| 0x000e | 4바이트 | 헤더 크기 | 124 |
| 0x0012 | 비트맵의 가로 폭 | info 헤더와 동일 | |
| 0x0016 | 비트맵의 세로 폭 | ||
| 0x001a | 2바이트 | 플레인 수 | |
| 0x001c | 1픽셀당 비트 수 | ||
| 0x001e | 4바이트 | 압축 형식 | |
| 0x0022 | 이미지 데이터 크기 | ||
| 0x0026 | 수평 방향의 해상도 | ||
| 0x002a | 수직 방향의 해상도 | ||
| 0x002e | 사용 색상 수 | ||
| 0x0032 | 중요한 색상 수 | ||
| 0x0036 | 적색 성분의 컬러 마스크 | V4 헤더와 동일 | |
| 0x003a | 녹색 성분의 컬러 마스크 | ||
| 0x003e | 청색 성분의 컬러 마스크 | ||
| 0x0042 | α 성분의 컬러 마스크 | ||
| 0x0046 | 색 공간 | 0(헤더 내에서 정의), 0x73524742('sRGB'), 0x57696e20('Win '), 0x4c494e4b('LINK'), 0x4d424544('MBED') | |
| 0x004a | 36바이트 | CIEXYZTRIPLE 구조체 | V4 헤더와 동일 |
| 0x006e | 4바이트 | 적색 성분의 감마 값 | |
| 0x0072 | 녹색 성분의 감마 값 | ||
| 0x0076 | 청색 성분의 감마 값 | ||
| 0x007a | 렌더링 의도 | 1, 2, 4, 8 | |
| 0x007e | 프로파일 데이터의 오프셋 | 정보 헤더의 시작 주소부터 프로파일 데이터의 시작 주소까지의 오프셋. 단위는 바이트 | |
| 0x0082 | 프로파일 데이터의 크기 | 단위는 바이트 | |
| 0x0086 | 예약 영역 | 항상 0 |
2.3. 컬러 마스크
컬러 마스크는 비트 필드 형식이 사용된 비트맵에서 각 색상 성분을 추출하는 데 사용되는 데이터이다. 빨강, 녹색, 파랑 성분 순으로 작성되며, 각각 4바이트씩 총 12바이트이다. Windows CE에서 압축 형식에 "알파 채널 포함 비트 필드"를 사용한 경우에는 이 뒤에 α 성분의 컬러 마스크가 추가되어 총 16바이트가 된다.
컬러 마스크 블록은 정보 헤더가 INFO 헤더이고 비트 필드 형식이 사용된 경우에 반드시 존재한다. V4, V5 헤더의 경우에는 헤더 내에 값이 저장되므로 이 블록을 배치할 필요가 없다.
1픽셀당 비트 수와 컬러 마스크의 조합이 다음과 같은 경우에는 압축 형식을 비압축으로 설정하고 컬러 마스크 블록을 생략할 수 있다.
| 컬러 마스크 | 16비트 | 32비트 |
|---|---|---|
| 빨강 성분 | 0x00007C00 | 0x00FF0000 |
| 녹색 성분 | 0x000003E0 | 0x0000FF00 |
| 파랑 성분 | 0x0000001F | 0x000000FF |
| α 성분 | 0x00000000 | 0x00000000 |
2.4. 색상 팔레트
색상 팔레트는 인덱스 색상 비트맵에서 사용되는 색상을 정의하는 데 사용된다. 인덱싱된 색상 이미지의 각 픽셀은 색상 팔레트의 인덱스(1, 4 또는 8비트)로 표현되며, 이 인덱스는 해당 픽셀의 색상을 나타낸다.
색상 팔레트의 각 항목은 일반적으로 파란색, 녹색, 빨간색, 0x00 순서로 4바이트를 차지하며, ARGB32 형식으로 지정된다. OS/2 BITMAPCOREHEADER영어에서 사용되는 색상 테이블은 항목당 3바이트의 RGB24 형식을 사용한다. 16비트 픽셀당(16bpp) 형식 이상인 경우, 색상 테이블은 일반적으로 사용되지 않지만, 색상 표시 기능이 제한된 장치에서 최적화를 위해 사용될 색상 목록을 저장하기 위해 존재할 수 있다. 팔레트의 항목 수는 2n (여기서 n은 픽셀당 비트 수)이거나 헤더에 지정된 더 작은 수이다.
2.4.1. RGBTRIPLE
RGBTRIPLE영어은 1색을 3바이트로 표기하는 형식으로, core 헤더인 경우에만 사용된다.
| 바이트 수 | 정보 | 값・비고 |
|---|---|---|
| 1 바이트 | 파랑 | 0~255 |
| 녹색 | ||
| 빨강 |
분류:컴퓨터 파일 포맷
2.4.2. RGBQUAD
RGBQUAD영어는 1색을 4바이트로 표현하는 형식으로, OS/2 비트맵에서의 RGB2영어도 여기에 해당한다. 색상 테이블의 각 항목은 일반적으로 파란색, 녹색, 빨간색, 0x00 순서로 4바이트를 차지하며, ARGB32 형식으로 지정된다.
| 바이트 수 | 정보 | 값 · 비고 |
|---|---|---|
| 1바이트 | 파랑 | 0-255 |
| 녹색 | ||
| 빨강 | ||
| 예약 영역 | ||
마이크로소프트는 1bpp, 4bpp 및 8bpp 인덱싱된 색상 이미지에 대한 BITMAPV4HEADER영어 및 BITMAPV5HEADER영어에서 유효한 알파 채널 비트 마스크의 존재를 허용한다. 이는 RGBQUAD.rgbReserved영어 멤버를 통해 8.8.8.[0-8].[0-8] 형식을 사용하여 색상 테이블 항목이 알파 구성 요소를 지정할 수도 있음을 나타낸다. 그러나 마이크로소프트 문서의 일부 버전에서는 RGBQUAD.rgbReserved영어 멤버가 "0이어야 한다"고 명시하여 이 기능을 허용하지 않는다.
2.5. 비트맵 데이터
비트맵 데이터는 실제 이미지의 픽셀 정보를 담고 있으며, 각 픽셀은 색상 팔레트의 인덱스 또는 RGB 값으로 표현된다. 픽셀 데이터는 일반적으로 이미지의 왼쪽 아래에서 시작하여 오른쪽 위 방향으로 저장된다. 그러나 이미지 높이가 음수인 경우에는 위에서 아래 방향으로 저장될 수도 있다.
각 픽셀을 나타내는 비트는 행(스트라이드 또는 스캔 라인이라고도 함)으로 묶인다. 각 행의 크기는 4바이트(32비트 DWORD)의 배수가 되도록 패딩 바이트(0x00)가 추가되어 조정된다.
픽셀 한 행을 저장하는 데 필요한 바이트 수(RowSize)는 다음 공식을 사용하여 계산할 수 있다.
* `BitsPerPixel`: 픽셀당 비트 수
* `ImageWidth`: 이미지 너비 (픽셀 단위)
* `⌊⌋`: 바닥 함수
* `⌈⌉`: 천장 함수
높이가 1보다 큰 이미지의 경우, 여러 개의 패딩된 행이 연속적으로 저장되어 픽셀 배열을 형성한다. 픽셀 배열을 저장하는 데 필요한 총 바이트 수(PixelArraySize)는 다음 공식을 사용하여 계산할 수 있다.
* `ImageHeight`: 이미지 높이 (픽셀 단위, 위에서 아래로 내려가는 이미지의 경우 음수)
픽셀 배열은 이미지를 픽셀 단위로 설명하는 32비트 DWORD의 블록이다. 픽셀은 일반적으로 "하단에서 위로" 저장되는데, 이는 이미지의 왼쪽 하단 모서리에서 시작하여 왼쪽에서 오른쪽으로, 그리고 행별로 아래에서 위로 이동하는 방식이다. 압축되지 않은 Windows 비트맵은 이미지 높이 값이 음수일 때 위에서 아래로 저장될 수도 있다. (가 사용되지 않는 한)
원래 OS/2 DIB에서 색상 깊이의 유효한 값은 픽셀당 1, 4, 8, 24비트(bpp)였다. 현대 DIB 헤더는 픽셀당 1, 2, 4, 8, 16, 24 및 32비트(bpp)의 픽셀 형식을 허용한다. GDI+는 픽셀당 64비트도 허용한다.
예시:
2x2 픽셀, 24비트 비트맵 (Windows DIB 헤더 ), 픽셀 형식 RGB24의 예:
| 오프셋 | 크기 | 16진수 값 | 값 | 설명 |
|---|---|---|---|---|
| 픽셀 배열 시작 (비트맵 데이터) | ||||
| 36h | 3 | 00 00 FF | 0 0 255 | 빨강, 픽셀 (x=0, y=1) |
| 39h | 3 | FF FF FF | 255 255 255 | 흰색, 픽셀 (x=1, y=1) |
| 3Ch | 2 | 00 00 | 0 0 | 4 바이트 정렬을 위한 패딩 (0이 아닌 값일 수 있음) |
| 3Eh | 3 | FF 00 00 | 255 0 0 | 파랑, 픽셀 (x=0, y=0) |
| 41h | 3 | 00 FF 00 | 0 255 0 | 녹색, 픽셀 (x=1, y=0) |
| 44h | 2 | 00 00 | 0 0 | 4 바이트 정렬을 위한 패딩 (0이 아닌 값일 수 있음) |
4x2 픽셀, 알파 채널에 불투명도 값을 가진 32비트 비트맵 (Windows DIB 헤더 ), 픽셀 형식 ARGB32의 예:
| Offset | Size | Hex 값 | 값 | 설명 |
|---|---|---|---|---|
| 픽셀 배열 시작 (비트맵 데이터) | ||||
| 7Ah | 4 | FF 00 00 7F | 255 0 0 127 | 파란색 (알파: 127), 픽셀 (x=0, y=1) |
| 7Eh | 4 | 00 FF 00 7F | 0 255 0 127 | 녹색 (알파: 127), 픽셀 (x=1, y=1) |
| 82h | 4 | 00 00 FF 7F | 0 0 255 127 | 빨간색 (알파: 127), 픽셀 (x=2, y=1) |
| 86h | 4 | FF FF FF 7F | 255 255 255 127 | 흰색 (알파: 127), 픽셀 (x=3, y=1) |
| 8Ah | 4 | FF 00 00 FF | 255 0 0 255 | 파란색 (알파: 255), 픽셀 (x=0, y=0) |
| 8Eh | 4 | 00 FF 00 FF | 0 255 0 255 | 녹색 (알파: 255), 픽셀 (x=1, y=0) |
| 92h | 4 | 00 00 FF FF | 0 0 255 255 | 빨간색 (알파: 255), 픽셀 (x=2, y=0) |
| 96h | 4 | FF FF FF FF | 255 255 255 255 | 흰색 (알파: 255), 픽셀 (x=3, y=0) |
3. 압축 방식
BMP 파일은 무압축이거나 RLE 방식으로 압축될 수 있다. RLE 압축은 반복되는 픽셀 값을 효과적으로 줄여 파일 크기를 줄일 수 있다. 윈도우에서는 BI_RGB(무압축), BI_RLE8(8비트 RLE), BI_RLE4(4비트 RLE), BI_BITFIELDS, BI_JPEG, BI_PNG 등의 압축 방식을 지원한다.
압축 방식 (바이트 #30-33)은 다음의 값을 갖는다. BI_RGB 비트맵의 경우 그림 크기 필드는 0이 될 수 있다.
인덱스 색상 이미지는 4비트 또는 8비트 RLE 알고리즘으로 압축될 수 있다. 16bpp 및 32bpp 이미지는 항상 압축되지 않은 상태로 저장된다. 모든 색 심도의 이미지는 원할 경우 압축 없이 저장될 수 있다.
4. 픽셀 형식
BMP 파일 형식은 픽셀 데이터를 다양한 방식으로 저장할 수 있으며, 이를 픽셀 형식이라고 한다. 각 픽셀 형식은 픽셀당 비트 수(bpp, bits per pixel)로 표현된다. 픽셀당 비트 수가 높을수록 더 많은 색상을 표현할 수 있다.
* 1bpp: 픽셀당 1비트를 사용하며, 2가지 색상(예: 검정, 흰색)을 표현한다. 각 비트는 색상 테이블의 인덱스를 가리킨다.
* 2bpp: 픽셀당 2비트를 사용하며, 4가지 색상을 표현한다. 1바이트에 4개의 픽셀이 저장된다.
* 4bpp: 픽셀당 4비트를 사용하며, 16가지 색상을 표현한다. 1바이트에 2개의 픽셀이 저장된다.
* 8bpp: 픽셀당 8비트를 사용하며, 256가지 색상을 표현한다. 1바이트에 1개의 픽셀이 저장된다.
* 16bpp: 픽셀당 16비트를 사용하며, 65,536가지 색상을 표현한다. 2바이트(WORD)에 1개의 픽셀이 저장되며, 각 픽셀은 알파, 빨강, 녹색, 파랑 샘플을 가질 수 있다.
* 24bpp: 픽셀당 24비트를 사용하며, 16,777,216가지 색상을 표현한다. 3바이트에 1개의 픽셀 값이 저장되며, 각 픽셀은 빨강, 녹색, 파랑 샘플을 가진다(파랑, 녹색, 빨강 순서).
* 32bpp: 픽셀당 32비트를 사용하며, 4,294,967,296가지 색상을 표현한다. 4바이트(DWORD)에 1개의 픽셀이 저장되며, 각 픽셀은 알파, 빨강, 녹색, 파랑 샘플을 가질 수 있다.
DIB 헤더는 BITFIELDS를 사용하여 픽셀의 특정 비트 그룹이 어떤 채널에 속하는지를 정의한다. 이를 통해 다양한 픽셀 형식을 유연하게 지원할 수 있다.
실제로는 수만 개의 픽셀 형식 정의가 가능하지만, 주로 사용되는 것은 몇 가지 안 된다. 예를 들어, RGB8, RGB4, RGB1과 같은 팔레트 형식과 RGB32, ARGB32, RGB24, RGB565 등 비압축 RGB 형식이 있다.
FFmpeg 2.1.4 버전에서는 bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, gray, pal8, monob 등의 BMP 픽셀 형식을 지원했다. 이 중 bgra만이 투명도를 지원했다.
다음은 24비트 비트맵(픽셀 형식 RGB24)과 32비트 비트맵(픽셀 형식 ARGB32)의 예시이다.
| 위치 (x, y) | 파랑 | 녹색 | 빨강 |
|---|---|---|---|
| (0, 1) | 0 | 0 | 255 |
| (1, 1) | 255 | 255 | 255 |
| (0, 0) | 255 | 0 | 0 |
| (1, 0) | 0 | 255 | 0 |
| 위치 (x, y) | 파랑 | 녹색 | 빨강 | 알파 |
|---|---|---|---|---|
| (0, 1) | 255 | 0 | 0 | 127 |
| (1, 1) | 0 | 255 | 0 | 127 |
| (2, 1) | 0 | 0 | 255 | 127 |
| (3, 1) | 255 | 255 | 255 | 127 |
| (0, 0) | 255 | 0 | 0 | 255 |
| (1, 0) | 0 | 255 | 0 | 255 |
| (2, 0) | 0 | 0 | 255 | 255 |
| (3, 0) | 255 | 255 | 255 | 255 |
5. BMP 파일 형식의 활용
BMP 파일 포맷은 단순하고 윈도우 등 여러 곳에서 널리 쓰이며, 특허에서 비교적 자유롭기 때문에 수많은 운영 체제가 제공하는 그림 처리 프로그램에서 읽고 쓸 수 있는 매우 일반적인 포맷이다. ICO 및 CUR 파일은 BITMAPINFOHEADER로 시작하는 비트맵을 포함한다.
많은 이전 그래픽 사용자 인터페이스는 내장 그래픽 서브시스템에서 비트맵을 사용했다. 예를 들어, Microsoft Windows 및 OS/2 플랫폼의 GDI 서브시스템에서 사용되는 형식은 'Windows 및 OS/2 비트맵 파일 형식'이며, 일반적으로 .BMP 파일 확장자로 명명된다.
대부분의 BMP 파일은 압축을 거의 하지 않아 상대적으로 크기가 큰 반면, ZIP과 같은 무손실 데이터 압축 알고리즘으로 상당 용량을 압축할 수 있다.
6. 관련 형식
X 윈도 시스템은 흑백 이미지에 XBM 형식을 사용하고, 컬러 이미지에는 XPM (픽셀맵) 형식을 사용한다. 이동식 픽스맵 (PPM)과 Truevision TGA 형식도 있지만 덜 사용되거나 특별한 목적에 사용된다. 예를 들어 TGA는 투명도 정보를 포함할 수 있다. ICO 및 CUR 파일은 BITMAPINFOHEADER로 시작하는 비트맵을 포함한다.
7. BMP를 다루는 프로그램 라이브러리
| 라이브러리 | 설명 |
|---|---|
| 윈도우 API(그래픽 장치 인터페이스), HBITMAP | 비트맵 데이터를 관리하는 객체 핸들. BMP 형식 이미지를 파일이나 리소스에서 읽어 HBITMAP을 생성할 수 있는 각종 C 언어 형식 함수가 준비되어 있다. 윈도우 데스크톱 애플리케이션 전용. |
| 마이크로소프트 파운데이션 클래스(MFC), CBitmap 클래스 | 마이크로소프트가 제공하는 개발 환경인 비주얼 C++(Visual C++)에 부속된 비트맵 조작 클래스. Win32 API의 래퍼. 윈도우 데스크톱 애플리케이션 전용. |
| 액티브 템플릿 라이브러리(ATL), ATL::CImage 클래스 | 마이크로소프트가 제공하는 개발 환경인 비주얼 C++(Visual C++)에 부속된 비트맵 조작 클래스. Win32 API 및 GDI+의 래퍼. 윈도우 데스크톱 애플리케이션 전용. |
| GDI+, Gdiplus::Bitmap 클래스 | 윈도우 SDK에 부속된 C++ 언어 전용 비트맵 조작 클래스. 윈도우 데스크톱 애플리케이션 전용. |
| 윈도우 이미징 컴포넌트(WIC) | 컴포넌트 객체 모델 기반의 이미지 라이브러리. 윈도우 데스크톱 애플리케이션/윈도우 스토어 앱에서 사용 가능. |
| .NET Framework, System.Drawing | GDI+의 매니지드 래퍼. 윈도우 데스크톱 애플리케이션 전용. 모노 (소프트웨어)(Mono)에도 호환 구현이 존재한다. |
| .NET Framework, System.Windows.Media.Imaging | WIC의 매니지드 래퍼. 윈도우 데스크톱 애플리케이션/윈도우 스토어 앱에서 사용 가능. |
서드파티 라이브러리에 관한 각 상세 정보는 외부 링크 항목에 기재되어 있다.