BMP 파일 포맷
| 파일 확장자 | .bmp, .dib |
|---|---|
| 인터넷 미디어 타입 |
image/bmp, image/x-bmp |
| 타입 코드 | 'BMP ' 'BMPf' 'BMPp' |
| UTI | com.microsoft.bmp |
| 개발 | 마이크로소프트 |
| 포맷 종류 | 래스터 그래픽스 |
| 오픈 포맷? | WMF용 OSP |
BMP 파일 포맷은 비트맵 디지털 그림을 저장하는 데 쓰이는 그림 파일 서식이다.특히, 마이크로소프트 윈도우, OS/2 운영 체제에 널리 쓰인다. 줄여서 비트맵, 또 장치 독립 비트맵의 경우 DIB 파일 서식이라고 한다. 래스터 그래픽스 이미지 파일 형식으로, 특히 마이크로소프트 윈도우[1] 및 OS/2[2] 운영 체제에서 디스플레이 장치(예: 그래픽스 어댑터)와 독립적으로 비트맵 디지털 이미지를 저장하는 데 사용된다.
BMP 파일 포맷은 다양한 색 깊이로 2차원 디지털 이미지를 저장할 수 있으며, 선택적으로 데이터 압축, 알파 채널 및 색 프로파일을 포함할 수 있다. 윈도우 메타파일 (WMF) 사양은 BMP 파일 포맷을 포함한다.[3]
장치 독립적 비트맵과 BMP 파일 포맷
[편집]마이크로소프트는 다양한 내부 표현을 가진 장치와 애플리케이션 간에 비트맵을 교환하는 데 도움을 주기 위해 다양한 색 깊이의 컬러 비트맵에 대한 특정 표현을 정의했다. 이를 장치 독립적 비트맵(DIB)이라고 불렀고, 이들의 파일 형식은 DIB 파일 형식 또는 BMP 이미지 파일 형식이라고 불린다.
마이크로소프트 지원에 따르면:[4]
장치 독립적 비트맵(DIB)은 다양한 색 해상도로 장치 독립적 비트맵을 정의하는 데 사용되는 형식이다. DIB의 주요 목적은 비트맵을 한 장치에서 다른 장치로 이동할 수 있도록 하는 것이다(따라서 이름의 장치 독립적 부분). DIB는 시스템에 비트맵 객체(애플리케이션에 의해 생성됨...)로 나타나는 장치 종속적 비트맵과 대조적으로 외부 형식이다. DIB는 일반적으로 메타파일(주로 StretchDIBits() 함수 사용), BMP 파일, 그리고 클립보드(CF_DIB 데이터 형식)로 전송된다.
다음 섹션에서는 BMP 파일 또는 DIB에 저장된 데이터에 대해 자세히 설명한다. 이것이 표준 BMP 파일 형식이다.[4] 일부 애플리케이션은 마이크로소프트 문서와 호환되지 않는 비트맵 이미지 파일을 생성한다. 또한 모든 필드가 사용되는 것은 아니다; 사용되지 않는 필드에는 0 값이 발견될 것이다.
파일 구조
[편집]비트맵 이미지 파일은 고정 크기 구조(헤더)와 미리 정해진 순서로 나타나는 가변 크기 구조로 구성된다. 이 파일 형식의 오랜 진화로 인해 이러한 구조 중 여러 가지 버전이 파일에 나타날 수 있다.
다이어그램 1을 참조하면, 비트맵 파일은 다음 순서로 구조로 구성된다:
| 구조 이름 | 선택 사항 | 크기 | 목적 | 비고 |
|---|---|---|---|---|
| 비트맵 파일 헤더 | 아니요 | 14 바이트 | 비트맵 이미지 파일에 대한 일반 정보 저장 | 파일이 메모리에 로드된 후에는 필요 없음 |
| DIB 헤더 | 아니요 | 고정 크기 (7가지 버전 존재) |
비트맵 이미지에 대한 자세한 정보 저장 및 픽셀 형식 정의 | 비트맵 파일 헤더 바로 다음에 위치 |
| 추가 비트 마스크 | 예 | 3 또는 4 DWORD[5] (12 또는 16 바이트) |
픽셀 형식 정의 | DIB 헤더가 BITMAPINFOHEADER이고 압축 방식 멤버가 BI_BITFIELDS 또는 BI_ALPHABITFIELDS로 설정된 경우에만 존재 |
| 색상표 | 준필수 | 가변 크기 | 비트맵 이미지 데이터(픽셀 배열)에서 사용되는 색상 정의 | 색 깊이가 8비트 이하인 경우 필수 |
| 간격1 | 예 | 가변 크기 | 구조 정렬 | 비트맵 파일 헤더의 픽셀 배열에 대한 파일 오프셋의 아티팩트 |
| 픽셀 배열 | 아니요 | 가변 크기 | 픽셀의 실제 값 정의 | 픽셀 형식은 DIB 헤더 또는 추가 비트 마스크에 의해 정의된다. 픽셀 배열의 각 행은 4바이트의 배수로 채워진다. |
| 간격2 | 예 | 가변 크기 | 구조 정렬 | DIB 헤더의 ICC 프로파일 데이터 오프셋 필드의 아티팩트 |
| ICC 색상 프로필 | 예 | 가변 크기 | 색상 관리를 위한 색상 프로필 정의 | 색상 프로필을 포함하는 외부 파일의 경로를 포함할 수도 있다. "비압축 DIB"로 메모리에 로드될 때, 색상표와 간격1 사이에 위치한다.[6] |
메모리의 DIB
[편집]메모리에 로드된 비트맵 이미지 파일은 DIB 데이터 구조가 된다. 이는 윈도우 GDI API의 중요한 구성 요소이다. 메모리 내 DIB 데이터 구조는 BMP 파일 형식과 거의 동일하지만, 14바이트 비트맵 파일 헤더를 포함하지 않으며 DIB 헤더로 시작한다. 메모리에 로드된 DIB의 경우, 색상표는 명시적인 RGB 색상 정의 대신 현재 실현된 팔레트[7]에 대한 인덱스를 구성하는 16비트 항목으로 구성될 수도 있다(추가 간접 수준). 모든 경우에 픽셀 배열은 4바이트의 배수인 메모리 주소에서 시작해야 한다. 메모리에 로드된 비압축 DIB의 경우, 선택적 색상 프로필 데이터는 색상표 바로 뒤, 그리고 간격1과 픽셀 배열[6] 앞에 위치해야 한다 (다이어그램 1과는 다르게).
간격1과 간격2의 크기가 0일 때, 메모리 내 DIB 데이터 구조는 관습적으로 "압축 DIB"라고 불리며 DIB 헤더의 시작을 가리키는 단일 포인터로 참조될 수 있다. 모든 경우에 픽셀 배열은 4바이트의 배수인 메모리 주소에서 시작해야 한다. 경우에 따라 픽셀 배열의 메모리 주소를 4바이트의 배수로 강제하기 위해 색상표의 항목 수를 조정해야 할 수도 있다.[7] 메모리에 로드된 "압축 DIB"의 경우, 선택적 색상 프로필 데이터는 다이어그램 1에 묘사된 대로(gap1=0 및 gap2=0) 픽셀 배열 바로 뒤에 와야 한다.[6]
"압축 DIB"는 윈도우 클립보드 API 함수뿐만 아니라 일부 윈도우 패턴 브러시 및 리소스 함수에도 필요하다.[8]
비트맵 파일 헤더
[편집]이 바이트 블록은 파일 시작 부분에 있으며 파일을 식별하는 데 사용된다. 일반적인 애플리케이션은 파일이 실제로 BMP 파일이고 손상되지 않았는지 확인하기 위해 이 블록을 먼저 읽는다. BMP 파일 형식의 처음 2바이트는 ASCII 인코딩에서 문자 "B" 다음에 문자 "M"이다. 모든 정수 값은 리틀 엔디언 형식(즉, 최하위 바이트 우선)으로 저장된다.
| 오프셋 16진수 | 오프셋 10진수 | 크기 | 목적 |
|---|---|---|---|
| 00 | 0 | 2 바이트 | BMP 및 DIB 파일을 식별하는 데 사용되는 헤더 필드는 십육진법으로 0x42 0x4D이며, ASCII로 BM과 같다. 다음 항목이 가능하다:
|
| 02 | 2 | 4 바이트 | BMP 파일의 크기(바이트) |
| 06 | 6 | 2 바이트 | 예약됨; 실제 값은 이미지를 생성하는 애플리케이션에 따라 달라지며, 수동으로 생성된 경우 0일 수 있다. |
| 08 | 8 | 2 바이트 | 예약됨; 실제 값은 이미지를 생성하는 애플리케이션에 따라 달라지며, 수동으로 생성된 경우 0일 수 있다. |
| 0A | 10 | 4 바이트 | 비트맵 이미지 데이터(픽셀 배열)를 찾을 수 있는 바이트의 오프셋, 즉 시작 주소. |
DIB 헤더 (비트맵 정보 헤더)
[편집]이 바이트 블록은 이미지에 대한 자세한 정보를 애플리케이션에 알려주며, 이는 이미지를 화면에 표시하는 데 사용될 것이다. 이 블록은 윈도우와 OS/2에서 내부적으로 사용되는 헤더와도 일치하며 여러 가지 다른 변형이 있다. 이들 모두는 크기를 지정하는 dword (32비트) 필드를 포함하므로 애플리케이션이 이미지에서 어떤 헤더가 사용되는지 쉽게 결정할 수 있다. 다른 헤더가 존재하는 이유는 마이크로소프트가 DIB 형식을 여러 번 확장했기 때문이다. 새로운 확장 헤더는 이전 헤더 대신 일부 GDI 함수와 함께 사용될 수 있으며, 더 많은 기능을 제공한다. GDI가 비트맵 파일을 로드하는 기능을 지원하기 때문에, 일반적인 윈도우 애플리케이션은 그 기능을 사용한다. 이로 인한 한 가지 결과는 그러한 애플리케이션의 경우, 지원하는 BMP 형식이 실행 중인 윈도우 버전에서 지원하는 형식과 일치한다는 것이다. 자세한 내용은 아래 표를 참조하라.
| 크기 | 헤더 이름 | OS 지원 | 기능 | 작성자 |
|---|---|---|---|---|
| 12 | BITMAPCOREHEADER OS21XBITMAPHEADER |
윈도우 2.0 이상 OS/2 1.x[2] |
||
| 64 | OS22XBITMAPHEADER | OS/2 BITMAPCOREHEADER2 | 하프톤 추가. RLE 및 허프먼 1D 압축 추가. | |
| 16 | OS22XBITMAPHEADER | 이전 헤더의 이 변형은 처음 16바이트만 포함하며, 나머지 바이트는 0 값으로 가정한다.[2]
예를 들어, BMP 스위트[9]의 pal8os2v2-16.bmp[10] 그래픽이 있다. |
||
| 40 | BITMAPINFOHEADER | 윈도우 NT, 3.1x 이상[1] | 비트맵 너비와 높이를 4바이트로 확장. 16bpp 및 32bpp 형식 추가. RLE 압축 추가. | |
| 52 | BITMAPV2INFOHEADER | 미등록 | RGB 비트 마스크 추가. | 어도비 포토샵 |
| 56 | BITMAPV3INFOHEADER | 공식적으로 문서화되지는 않았지만, 이 문서는 어도비 직원이 어도비 포럼에 올렸으며, 이 표준이 한때 공식 MS 문서에 포함되었다고 언급했다.[11] | 알파 채널 비트 마스크 추가. | 어도비 포토샵 |
| 108 | BITMAPV4HEADER | 윈도우 NT 4.0, 95 이상 | 색상 공간 유형 및 감마 보정 추가 | |
| 124 | BITMAPV5HEADER | 윈도우 NT 5.0, 98 이상 | ICC 색상 프로파일 추가 | 김프 |
| 오프셋 (16진수) | 오프셋 (10진수) | 크기 (바이트) | OS/2 1.x BITMAPCOREHEADER[2] |
|---|---|---|---|
| 0E | 14 | 4 | 이 헤더의 크기 (12바이트) |
| 12 | 18 | 2 | 픽셀 단위 비트맵 너비 (부호 없는 16비트) |
| 14 | 20 | 2 | 픽셀 단위 비트맵 높이 (부호 없는 16비트) |
| 16 | 22 | 2 | 색상 평면 수, 1이어야 한다 |
| 18 | 24 | 2 | 픽셀당 비트 수 |
윈도우 2.x BITMAPCOREHEADER는 OS/2 1.x BITMAPCOREHEADER(위 표에 표시됨)와 이미지 너비 및 높이 필드가 부호 없는 정수가 아니라 부호 있는 정수라는 한 가지 세부 사항에서 다르다.[12]
BITMAPINFOHEADER 이후 버전은 이전 버전의 헤더 끝에 필드를 추가하기만 한다. 예를 들어: BITMAPV2INFOHEADER는 BITMAPINFOHEADER에 필드를 추가하고, BITMAPV3INFOHEADER는 BITMAPV2INFOHEADER에 필드를 추가한다.
통합 알파 채널은 미등록 BITMAPV3INFOHEADER와 문서화된 BITMAPV4HEADER(윈도우 95 이후)에서 도입되었으며, 윈도우 XP 로그인 및 테마 시스템과 마이크로소프트 오피스(2000 버전 이후)에서 사용된다. 어도비 포토샵 7 버전 이후 및 어도비 플래시 MX 2004 버전 이후(당시에는 매크로미디어 플래시로 알려짐)와 같은 일부 이미지 편집 소프트웨어에서 지원된다. 또한 김프, 구글 크롬, 마이크로소프트 파워포인트 및 마이크로소프트 워드에서도 지원된다.
호환성 때문에 대부분의 애플리케이션은 파일을 저장할 때 이전 DIB 헤더를 사용한다. 윈도우 2000 이후 OS/2가 더 이상 지원되지 않으므로, 현재 일반적인 윈도우 형식은 BITMAPINFOHEADER 헤더이다. 다음 표에서 그 설명을 참조하라. 모든 값은 명시적으로 언급되지 않는 한 부호 없는 정수로 저장된다.
| 오프셋 (16진수) | 오프셋 (10진수) | 크기 (바이트) | 윈도우즈 BITMAPINFOHEADER[1] |
|---|---|---|---|
| 0E | 14 | 4 | 이 헤더의 크기 (바이트 단위) (40) |
| 12 | 18 | 4 | 비트맵 너비 (픽셀 단위) (부호 있는 정수) |
| 16 | 22 | 4 | 비트맵 높이 (픽셀 단위) (부호 있는 정수) |
| 1A | 26 | 2 | 색상 평면 수 (반드시 1) |
| 1C | 28 | 2 | 픽셀당 비트 수, 즉 이미지의 색상 깊이. 일반적인 값은 1, 4, 8, 16, 24, 32이다. |
| 1E | 30 | 4 | 사용 중인 압축 방법. 가능한 값 목록은 다음 표 참조 |
| 22 | 34 | 4 | 이미지 크기. 원시 비트맵 데이터의 크기이다. BI_RGB 비트맵의 경우 더미 0을 줄 수 있다. |
| 26 | 38 | 4 | 이미지의 가로 해상도. (미터당 픽셀, 부호 있는 정수) |
| 2A | 42 | 4 | 이미지의 세로 해상도. (미터당 픽셀, 부호 있는 정수) |
| 2E | 46 | 4 | 색상 팔레트의 색상 수, 또는 2n으로 기본값을 지정하려면 0 |
| 32 | 50 | 4 | 사용된 중요한 색상 수, 또는 모든 색상이 중요한 경우 0; 일반적으로 무시됨 |
압축 방식 (오프셋 30)은 다음 중 하나일 수 있다:
| 값 | 식별자 | 압축 방식 | 비고 |
|---|---|---|---|
| 0 | BI_RGB | 없음 | 가장 일반적 |
| 1 | BI_RLE8 | RLE 8비트/픽셀 | 8비트/픽셀 비트맵에만 사용 가능 |
| 2 | BI_RLE4 | RLE 4비트/픽셀 | 4비트/픽셀 비트맵에만 사용 가능 |
| 3 | BI_BITFIELDS | OS22XBITMAPHEADER: 허프먼 1D | BITMAPV2INFOHEADER: RGB 비트 필드 마스크, BITMAPV3INFOHEADER+: RGBA |
| 4 | BI_JPEG | OS22XBITMAPHEADER: RLE-24 | BITMAPV4INFOHEADER+: 인쇄용 JPEG 이미지[13] |
| 5 | BI_PNG | BITMAPV4INFOHEADER+: 인쇄용 PNG 이미지[13] | |
| 6 | BI_ALPHABITFIELDS | RGBA 비트 필드 마스크 | 윈도우 CE 5.0 .NET 4.0 이상에서만 |
| 11 | BI_CMYK | 없음 | 윈도우 메타파일 CMYK에서만[3] |
| 12 | BI_CMYKRLE8 | RLE-8 | 윈도우 메타파일 CMYK에서만 |
| 13 | BI_CMYKRLE4 | RLE-4 | 윈도우 메타파일 CMYK에서만 |
OS/2 2.x OS22XBITMAPHEADER(IBM 문서에서는 BITMAPINFOHEADER2)는 24바이트가 추가된다:[2]
| 오프셋 (16진수) | 오프셋 (10진수) | 크기 (바이트) | OS/2 OS22XBITMAPHEADER (BITMAPINFOHEADER2)[2] |
|---|---|---|---|
| 36 | 54 | 2 | 가로 및 세로 해상도(오프셋 38 및 42)의 단위를 지정하는 열거 값. 정의된 유일한 값은 0으로, 미터당 픽셀을 의미한다. |
| 38 | 56 | 2 | 패딩. 무시되며 0이어야 한다. |
| 3A | 58 | 2 | 비트가 비트맵을 채우는 방향을 나타내는 열거 값. 정의된 유일한 값은 0으로, 원점이 왼쪽 하단 모서리임을 의미한다. 비트는 왼쪽에서 오른쪽으로 채워지고, 그 다음 아래에서 위로 채워진다.
이 필드를 포함하지 않는 윈도우 비트맵은 이미지 높이에 음수 값을 사용하여 왼쪽 상단 원점(비트가 왼쪽에서 오른쪽으로, 그 다음 위에서 아래로 채워짐)을 지정할 수도 있다. |
| 3C | 60 | 2 | 이미지를 렌더링할 때 사용해야 하는 하프토닝 알고리즘을 나타내는 열거 값. |
| 3E | 62 | 4 | 하프토닝 매개변수 1 (아래 참조) |
| 42 | 66 | 4 | 하프토닝 매개변수 2 (아래 참조) |
| 46 | 70 | 4 | 색상표의 각 항목에 대한 색상 인코딩을 나타내는 열거 값. 정의된 유일한 값은 0으로, RGB를 나타낸다. |
| 4A | 74 | 4 | 애플리케이션 정의 식별자. 이미지 렌더링에는 사용되지 않는다. |
하프토닝 알고리즘 (오프셋 60)은 다음 중 하나일 수 있다:
| 값 | 하프토닝 알고리즘 | 비고 |
|---|---|---|
| 0 | 없음 | 가장 일반적 |
| 1 | 오차 확산 | 하프토닝 매개변수 1 (오프셋 64)은 오차 감쇠율 백분율이다. 100은 감쇠가 없음을 나타낸다. 0은 오차가 확산되지 않음을 나타낸다. |
| 2 | PANDA: 비부호화 문서 획득 처리 알고리즘 | 하프토닝 매개변수 1과 2 (각각 오프셋 64와 68)는 사용된 하프토닝 패턴의 X 및 Y 차원(픽셀 단위)을 나타낸다. |
| 3 | 슈퍼 서클 | 하프토닝 매개변수 1과 2 (각각 오프셋 64와 68)는 사용된 하프토닝 패턴의 X 및 Y 차원(픽셀 단위)을 나타낸다. |
색상표
[편집]색상표(팔레트)는 BMP 파일 헤더, DIB 헤더, 그리고 BITMAPINFOHEADER 헤더에 BI_BITFIELDS (12바이트) 또는 BI_ALPHABITFIELDS (16바이트) 옵션이 사용된 경우 선택적 세 개 또는 네 개의 비트마스크 뒤에 바로 BMP 이미지 파일에 나타난다. 따라서 그 오프셋은 BITMAPFILEHEADER의 크기와 DIB 헤더의 크기(선택적 세 개 또는 네 개의 비트 마스크에 대한 12-16바이트 추가)를 합한 값이다.
참고: 윈도우 CE에서는 BITMAPINFOHEADER 헤더가 biCompression 멤버에서 BI_ALPHABITFIELDS[5] 옵션과 함께 사용될 수 있다.
팔레트의 항목 수는 2n (여기서 n은 픽셀당 비트 수)이거나 헤더에 지정된 더 작은 숫자이다 (OS/2 BITMAPCOREHEADER 헤더 형식에서는 전체 크기 팔레트만 지원된다).[2][4] 대부분의 경우, 색상표의 각 항목은 파랑, 녹색, 빨강, 0x00 순서로 4바이트를 차지한다 (예외는 아래 참조). 이는 BITMAPINFOHEADER의 biBitCount 구조 멤버에서 인덱싱된다.
색상표는 이미지에서 사용되는 색상을 나열하는 바이트 블록(테이블)이다. 인덱스 색상 이미지의 각 픽셀은 이 테이블에 의해 설명되는 단일 색상의 인덱스인 비트 수(1, 4 또는 8)로 설명된다. 인덱스 색상 비트맵에서 색상 팔레트의 목적은 각 인덱스 값이 어떤 실제 색상에 해당하는지 애플리케이션에 알리는 것이다. 비인덱스(비팔레트화) 비트맵에서 색상표의 목적은 제한된 색상 표시 기능을 가진 장치에서 최적화를 위해 비트맵이 사용하는 색상을 나열하고, 나중에 다른 픽셀 형식으로 변환 및 팔레트화를 용이하게 하는 것이다.
색상표의 색상은 일반적으로 항목당 4바이트 ARGB32 형식으로 지정된다. OS/2 BITMAPCOREHEADER와 함께 사용되는 색상표는 항목당 3바이트 RGB24 형식을 사용한다.[2][4] 메모리에 로드된 DIB의 경우, 색상표는 선택적으로 2바이트 항목으로 구성될 수 있다. 이 항목은 명시적인 RGB 색상 정의 대신 현재 실현된 팔레트[7]에 대한 인덱스를 구성한다.
마이크로소프트는 1bpp, 4bpp, 8bpp 인덱스 색상 이미지에 대해 BITMAPV4HEADER 및 BITMAPV5HEADER에 유효한 알파 채널 비트 마스크[14]의 존재를 금지하지 않는데, 이는 색상표 항목이 RGBQUAD.rgbReserved[15] 멤버를 통해 8.8.8.[0-8].[0-8] 형식을 사용하여 알파 구성 요소를 지정할 수도 있음을 나타낸다. 그러나 마이크로소프트 문서의 일부 버전은 RGBQUAD.rgbReserved 멤버가 "0이어야 한다"고 명시하여 이 기능을 허용하지 않는다.
위에서 언급했듯이, 픽셀이 픽셀당 16비트(16bpp) 형식(및 그 이상)일 때는 색상표가 일반적으로 사용되지 않는다. 이러한 비트맵 이미지 파일에는 일반적으로 색상표 항목이 없다. 그러나 마이크로소프트 문서(2010년 11월 16일 현재 MSDN 웹사이트[16])는 16bpp(및 그 이상)의 경우, 제한된 색상 표시 기능을 가진 장치에서 최적화를 위해 색상 목록을 저장하기 위해 색상표가 존재할 수 있다고 명시하고 있으며, 그러한 경우 이 색상표에는 인덱스 팔레트 항목이 없다고도 명시한다. 이는 필수 팔레트 항목과 선택적 색상 목록을 구분하지 않으면 모순처럼 보일 수 있다.
픽셀 저장
[편집]비트맵 픽셀을 나타내는 비트는 행(스트라이드 또는 스캔 라인이라고도 함)에 압축되어 있다. 각 행의 크기는 패딩을 통해 4바이트(32비트 DWORD)의 배수로 반올림된다.[17]
높이가 1보다 큰 이미지의 경우, 여러 개의 패딩된 행이 연속적으로 저장되어 픽셀 배열을 형성한다.
한 줄의 픽셀을 저장하는 데 필요한 총 바이트 수는 다음과 같이 계산할 수 있다:
2n 색상을 가진 n비트/픽셀(bpp) 이미지에서 픽셀 배열을 저장하는 데 필요한 총 바이트 수는 각 행의 크기를 4바이트의 배수로 반올림하는 효과를 고려하여 다음과 같이 계산할 수 있다.
픽셀 배열 (비트맵 데이터)
[편집]픽셀 배열은 픽셀별로 이미지를 설명하는 32비트 DWORD 블록이다. 일반적으로 픽셀은 왼쪽 하단 모서리에서 시작하여 왼쪽에서 오른쪽으로, 그리고 이미지의 하단에서 상단으로 행별로 "상향식"으로 저장된다.[4] BITMAPCOREHEADER가 사용되지 않는 한, 압축되지 않은 윈도우 비트맵은 이미지 높이 값이 음수인 경우 상단에서 하단으로 저장될 수도 있다.
원본 OS/2 DIB에서, 허용되는 색상 깊이 값은 1, 4, 8, 24비트/픽셀(bpp)이었다.[4] 현대 DIB 헤더는 픽셀당 1, 2, 4, 8, 16, 24, 32비트(bpp)의 픽셀 형식을 허용한다.[18] GDI+는 픽셀당 64비트도 허용한다.[19]
행의 길이를 4바이트의 배수로 맞추기 위해 패딩 바이트(반드시 0은 아님)를 행 끝에 추가해야 한다. 픽셀 배열이 메모리에 로드될 때, 각 행은 4의 배수인 메모리 주소에서 시작해야 한다. 이 주소/오프셋 제한은 메모리에 로드된 픽셀 배열에만 필수적이다. 파일 저장 목적의 경우, 각 행의 크기만 4바이트의 배수여야 하며 파일 오프셋은 임의적일 수 있다.[4] 너비가 1인 24비트 비트맵은 행당 3바이트의 데이터(파랑, 녹색, 빨강)와 1바이트의 패딩을 가지며, 너비가 2인 경우는 6바이트의 데이터와 2바이트의 패딩, 너비가 3인 경우는 9바이트의 데이터와 3바이트의 패딩, 너비가 4인 경우는 12바이트의 데이터와 패딩이 없다.
압축
[편집]- 인덱스 색상 이미지는 4비트 또는 8비트 RLE 또는 허프먼 1D 알고리즘으로 압축될 수 있다.
- OS/2 BITMAPCOREHEADER2 24bpp 이미지는 24비트 RLE 알고리즘으로 압축될 수 있다.
- 16bpp 및 32bpp 이미지는 항상 압축되지 않은 상태로 저장된다.
- 모든 색상 깊이의 이미지는 원하는 경우 압축 없이 저장할 수 있다.
픽셀 형식
[편집]- 픽셀당 1비트(1bpp) 형식은 2가지 고유한 색상(예: 흑백)을 지원한다. 픽셀 값은 각 비트에 저장되며, 첫 번째(가장 왼쪽) 픽셀은 첫 번째 바이트의 최상위 비트에 있다.[4] 각 비트는 2가지 색상 테이블에 대한 인덱스이다. 설정되지 않은 비트는 첫 번째 색상 테이블 항목을 참조하고, 설정된 비트는 마지막(두 번째) 색상 테이블 항목을 참조한다.
- 픽셀당 2비트(2bpp) 형식은 4가지 고유한 색상을 지원하며 1바이트당 4픽셀을 저장하며, 가장 왼쪽 픽셀은 두 개의 최상위 비트에 있다(윈도우 CE만 해당:[20]). 각 픽셀 값은 최대 4가지 색상 테이블에 대한 2비트 인덱스이다.
- 픽셀당 4비트(4bpp) 형식은 16가지 고유한 색상을 지원하며 1바이트당 2픽셀을 저장하며, 가장 왼쪽 픽셀은 더 중요한 니블에 있다.[4] 각 픽셀 값은 최대 16가지 색상 테이블에 대한 4비트 인덱스이다.
- 픽셀당 8비트(8bpp) 형식은 256가지 고유한 색상을 지원하며 1바이트당 1픽셀을 저장한다. 각 바이트는 최대 256가지 색상 테이블에 대한 인덱스이다.
- 픽셀당 16비트(16bpp) 형식은 65536가지 고유한 색상을 지원하며 2바이트 워드당 1픽셀을 저장한다. 각 워드는 픽셀의 알파, 빨강, 녹색, 파랑 샘플을 정의할 수 있다.
- 픽셀당 24비트(24bpp) 형식은 16,777,216가지 고유한 색상을 지원하며 3바이트당 1픽셀 값을 저장한다. 각 픽셀 값은 픽셀의 빨강, 녹색, 파랑 샘플(RGBAX 표기법에서 8.8.8.0.0)을 정의한다. 구체적으로는 파랑, 녹색, 빨강 순서(각 샘플당 8비트)이다.[4]
- 픽셀당 32비트(32bpp) 형식은 4,294,967,296가지 고유한 색상을 지원하며 4바이트 DWORD당 1픽셀을 저장한다. 각 DWORD는 픽셀의 알파, 빨강, 녹색, 파랑 샘플을 정의할 수 있다.
어떤 비트가 어떤 샘플을 정의하는지에 대한 모호성을 해결하기 위해, DIB 헤더는 특정 비트필드를 제공하며, 이는 픽셀 내 특정 비트 그룹이 특정 채널에 속하는 것을 정의하는 비트 마스크이다. 다음 다이어그램은 이 메커니즘을 정의한다:
비트필드 비트 마스크에 의해 정의된 샘플 필드는 연속적이고 중복되지 않아야 하지만, 샘플 필드의 순서는 임의적이다. 가장 보편적인 필드 순서는 알파, 파랑, 녹색, 빨강(MSB에서 LSB)이다. 빨강, 녹색, 파랑 비트 마스크는 DIB 헤더의 압축 멤버가 BI_BITFIELDS로 설정된 경우에만 유효하다. 알파 비트 마스크는 DIB 헤더에 존재하거나 DIB 헤더의 압축 멤버가 BI_ALPHABITFIELDS[5]로 설정된 경우 유효하다(윈도우 CE만 해당).
RGB 비디오 서브타입
[편집]위에서 설명된 BITFIELD 메커니즘은 수만 가지의 다양한 픽셀 형식을 정의할 수 있지만, 실제로는 몇 가지 형식만 사용된다.[21] 모든 팔레트 형식 RGB8, RGB4, RGB1 (위 표에서 노란색으로 표시됨, dshow.h.MEDIASUBTYPE 이름으로 정의됨):
| R.G.B.A.X | RGB 서브타입 | R.G.B.A.X | ARGB 서브타입 |
|---|---|---|---|
| 8.8.8.0.8 | RGB32 | 8.8.8.8.0 | ARGB32 |
| 10.10.10.2.0 | A2R10G10B10 | ||
| 8.8.8.0.0 | RGB24 | 10.10.10.2.0 | A2B10G10R10 |
| 5.6.5.0.0 | RGB565 | 4.4.4.4.0 | ARGB4444 |
| 5.5.5.0.1 | RGB555 | 5.5.5.1.0 | ARGB1555 |
| 비트 필드 | 오프셋
(16진수) |
비트 A2R10G10B10 | 비트 A2B10G10R10 | ||||
|---|---|---|---|---|---|---|---|
| 빨강 | 36 | 00 00 F0 3F
|
LE: 3FF00000
|
20...29
|
FF 03 00 00
|
LE: 000003FF
|
0... 9
|
| 녹색 | 3A | 00 FC 0F 00
|
LE: 000FFC00
|
10...19
|
00 FC 0F 00
|
LE: 000FFC00
|
10...19
|
| 파랑 | 3E | FF 03 00 00
|
LE: 000003FF
|
0... 9
|
00 00 F0 3F
|
LE: 3FF00000
|
20...29
|
| 알파 | 42 | 00 00 00 C0
|
LE: C0000000
|
30...31
|
00 00 00 C0
|
LE: C0000000
|
30...31
|
버전 2.1.4 FFmpeg은 (자체 용어로) BMP 픽셀 형식 bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, gray, pal8, monob를 지원했다. 즉, bgra는 투명도가 지원되는 유일한 픽셀 형식이었다.[23]

예제 1
[편집]다음은 픽셀 형식 RGB24인 2×2 픽셀, 24비트 비트맵(윈도우 DIB 헤더 BITMAPINFOHEADER)의 예시이다.
| 오프셋
(16진수) |
크기
(바이트) |
16진수 값 | 값 | 설명 |
|---|---|---|---|---|
| BMP 헤더 | ||||
| 00 | 2 | 42 4D | "BM" | ID 필드 (42h, 4Dh) |
| 02 | 4 | 46 00 00 00 | 70 바이트 (54+16) | BMP 파일 크기 (54바이트 헤더 + 16바이트 데이터) |
| 06 | 2 | 00 00 | 사용되지 않음 | 애플리케이션 특정 |
| 08 | 2 | 00 00 | 사용되지 않음 | 애플리케이션 특정 |
| 0A | 4 | 36 00 00 00 | 54 바이트 (14+40) | 픽셀 배열 (비트맵 데이터)을 찾을 수 있는 오프셋 |
| DIB 헤더 | ||||
| 0E | 4 | 28 00 00 00 | 40 바이트 | DIB 헤더의 바이트 수 (이 지점부터) |
| 12 | 4 | 02 00 00 00 | 2 픽셀 (좌우 순서) | 비트맵의 너비 (픽셀 단위) |
| 16 | 4 | 02 00 00 00 | 2 픽셀 (하단에서 상단 순서) | 비트맵의 높이 (픽셀 단위). 상향식 픽셀 순서의 경우 양수. |
| 1A | 2 | 01 00 | 1 평면 | 사용 중인 색상 평면 수 |
| 1C | 2 | 18 00 | 24 비트 | 픽셀당 비트 수 |
| 1E | 4 | 00 00 00 00 | 0 | BI_RGB, 픽셀 배열 압축 사용 안함 |
| 22 | 4 | 10 00 00 00 | 16 바이트 | 원시 비트맵 데이터 크기 (패딩 포함) |
| 26 | 4 | 13 0B 00 00 | 가로 2835 픽셀/미터 | 이미지의 인쇄 해상도, 72 DPI × 39.3701 인치/미터는 2834.6472를 산출한다. |
| 2A | 4 | 13 0B 00 00 | 세로 2835 픽셀/미터 | |
| 2E | 4 | 00 00 00 00 | 0 색상 | 팔레트의 색상 수 |
| 32 | 4 | 00 00 00 00 | 0 중요한 색상 | 0은 모든 색상이 중요함을 의미한다 |
| 픽셀 배열 (비트맵 데이터) 시작 | ||||
| 36 | 3 | 00 00 FF | 0 0 255 | 빨강, 픽셀 (x=0, y=1) |
| 39 | 3 | FF FF FF | 255 255 255 | 흰색, 픽셀 (x=1, y=1) |
| 3C | 2 | 00 00 | 0 0 | 4바이트 정렬을 위한 패딩 (0이 아닌 값일 수도 있음) |
| 3E | 3 | FF 00 00 | 255 0 0 | 파랑, 픽셀 (x=0, y=0) |
| 41 | 3 | 00 FF 00 | 0 255 0 | 녹색, 픽셀 (x=1, y=0) |
| 44 | 2 | 00 00 | 0 0 | 4바이트 정렬을 위한 패딩 (0이 아닌 값일 수도 있음) |

예제 2
[편집]다음은 알파 채널에 불투명도 값이 있는 4×2 픽셀, 32비트 비트맵(윈도우 DIB 헤더 BITMAPV4HEADER)의 예시이며, 픽셀 형식은 ARGB32이다.
| 오프셋
(16진수) |
크기
(바이트) |
16진수 값 | 값 | 설명 |
|---|---|---|---|---|
| BMP 헤더 | ||||
| 00 | 2 | 42 4D | "BM" | ID 필드 (42h, 4Dh) |
| 02 | 4 | 9A 00 00 00 | 154 바이트 (122+32) | BMP 파일 크기 |
| 06 | 2 | 00 00 | 사용되지 않음 | 애플리케이션 특정 |
| 08 | 2 | 00 00 | 사용되지 않음 | 애플리케이션 특정 |
| 0A | 4 | 7A 00 00 00 | 122 바이트 (14+108) | 픽셀 배열 (비트맵 데이터)을 찾을 수 있는 오프셋 |
| DIB 헤더 | ||||
| 0E | 4 | 6C 00 00 00 | 108 바이트 | DIB 헤더의 바이트 수 (이 지점부터) |
| 12 | 4 | 04 00 00 00 | 4 픽셀 (좌우 순서) | 비트맵의 너비 (픽셀 단위) |
| 16 | 4 | 02 00 00 00 | 2 픽셀 (하단에서 상단 순서) | 비트맵의 높이 (픽셀 단위) |
| 1A | 2 | 01 00 | 1 평면 | 사용 중인 색상 평면 수 |
| 1C | 2 | 20 00 | 32 비트 | 픽셀당 비트 수 |
| 1E | 4 | 03 00 00 00 | 3 | BI_BITFIELDS, 픽셀 배열 압축 사용 안함 |
| 22 | 4 | 20 00 00 00 | 32 바이트 | 원시 비트맵 데이터 크기 (패딩 포함) |
| 26 | 4 | 13 0B 00 00 | 가로 2835 픽셀/미터 | 이미지의 인쇄 해상도, 72 DPI × 39.3701 인치/미터는 2834.6472를 산출한다. |
| 2A | 4 | 13 0B 00 00 | 세로 2835 픽셀/미터 | |
| 2E | 4 | 00 00 00 00 | 0 색상 | 팔레트의 색상 수 |
| 32 | 4 | 00 00 00 00 | 0 중요한 색상 | 0은 모든 색상이 중요함을 의미한다 |
| 36 | 4 | 00 00 FF 00 | 빅 엔디언에서 00FF0000 | 빨강 채널 비트 마스크 (BI_BITFIELDS가 지정되어 유효함) |
| 3A | 4 | 00 FF 00 00 | 빅 엔디언에서 0000FF00 | 녹색 채널 비트 마스크 (BI_BITFIELDS가 지정되어 유효함) |
| 3E | 4 | FF 00 00 00 | 빅 엔디언에서 000000FF | 파랑 채널 비트 마스크 (BI_BITFIELDS가 지정되어 유효함) |
| 42 | 4 | 00 00 00 FF | 빅 엔디언에서 FF000000 | 알파 채널 비트 마스크 |
| 46 | 4 | 20 6E 69 57 | 리틀 엔디언 "Win "
|
LCS_WINDOWS_COLOR_SPACE |
| 4A | 36 | 00...00 | CIEXYZTRIPLE 색상 공간 엔드포인트 | LCS "Win " 또는 "sRGB"에는 사용되지 않음
|
| 6E | 4 | 00 00 00 00 | 0 빨강 감마 | LCS "Win " 또는 "sRGB"에는 사용되지 않음
|
| 72 | 4 | 00 00 00 00 | 0 녹색 감마 | LCS "Win " 또는 "sRGB"에는 사용되지 않음
|
| 76 | 4 | 00 00 00 00 | 0 파랑 감마 | LCS "Win " 또는 "sRGB"에는 사용되지 않음
|
| 픽셀 배열 (비트맵 데이터) 시작 | ||||
| 7A | 4 | FF 00 00 7F | 255 0 0 127 | 파랑 (알파: 127), 픽셀 (x=0, y=1) |
| 7E | 4 | 00 FF 00 7F | 0 255 0 127 | 녹색 (알파: 127), 픽셀 (x=1, y=1) |
| 82 | 4 | 00 00 FF 7F | 0 0 255 127 | 빨강 (알파: 127), 픽셀 (x=2, y=1) |
| 86 | 4 | FF FF FF 7F | 255 255 255 127 | 흰색 (알파: 127), 픽셀 (x=3, y=1) |
| 8A | 4 | FF 00 00 FF | 255 0 0 255 | 파랑 (알파: 255), 픽셀 (x=0, y=0) |
| 8E | 4 | 00 FF 00 FF | 0 255 0 255 | 녹색 (알파: 255), 픽셀 (x=1, y=0) |
| 92 | 4 | 00 00 FF FF | 0 0 255 255 | 빨강 (알파: 255), 픽셀 (x=2, y=0) |
| 96 | 4 | FF FF FF FF | 255 255 255 255 | 흰색 (알파: 255), 픽셀 (x=3, y=0) |
비트맵 데이터가 이미지의 왼쪽 하단 모서리에서 시작한다는 점에 유의하라.
BMP 형식의 사용
[편집]BMP 파일 형식의 단순성, 윈도우 및 기타 환경에서의 광범위한 친숙도, 그리고 이 형식이 비교적 잘 문서화되어 있고 오픈 포맷이라는 사실은 BMP를 많은 운영 체제의 이미지 처리 프로그램이 읽고 쓸 수 있는 매우 일반적인 형식으로 만든다. ICO 및 CUR 파일은 BITMAPINFOHEADER로 시작하는 비트맵을 포함한다.
많은 구형 그래픽 사용자 인터페이스는 내장 그래픽 하위 시스템에서 비트맵을 사용했다.[24] 예를 들어, 마이크로소프트 윈도우 및 OS/2 플랫폼의 GDI 하위 시스템에서 사용되는 특정 형식은 윈도우 및 OS/2 비트맵 파일 형식이며, 일반적으로 파일 확장자 .BMP로 이름이 지정된다.[25]
대부분의 BMP 파일은 압축이 없거나(또는 팔레트화된 이미지에 대한 일반적으로 낮은 비율의 런 렝스 부호화) 파일 크기가 비교적 크지만, 많은 BMP 파일은 중복 데이터를 포함하기 때문에 ZIP과 같은 비손실 데이터 압축 알고리즘으로 상당히 압축될 수 있다. RAR과 같은 일부 형식은 이러한 데이터의 효율적인 압축을 위해 특별히 고안된 루틴을 포함하기도 한다.
관련 형식
[편집]X 윈도 시스템은 흑백 이미지에 유사한 XBM 형식을 사용하고, 색상 이미지에는 XPM(픽셀맵)을 사용한다. 또한 다른 정보 없이 원시 데이터를 저장하는 다양한 "원시" 형식도 있다. 포터블 픽스맵(PPM) 및 트루비전 TGA 형식도 존재하지만, 덜 자주 사용되거나 특정 목적(예: TGA는 투명도 정보를 포함할 수 있음)으로만 사용된다.
각주
[편집]- ↑ 가 나 다 James D. Murray; William vanRyper (April 1996). 《Encyclopedia of Graphics File Formats》 Seco판. O'Reilly. bmp. ISBN 1-56592-161-5. 2014년 3월 7일에 확인함.
- ↑ 가 나 다 라 마 바 사 아 James D. Murray; William vanRyper (April 1996). 《Encyclopedia of Graphics File Formats》 Seco판. O'Reilly. os2bmp. ISBN 1-56592-161-5. 2014년 3월 7일에 확인함.
- ↑ 가 나 “[MS-WMF]: Windows Metafile Format”. MSDN. 2014년 2월 13일. 2014년 3월 12일에 확인함.
- ↑ 가 나 다 라 마 바 사 아 자 차 “DIBs and Their Uses”. 《Microsoft Help and Support》. 2015년 5월 14일에 확인함.
- ↑ 가 나 다 MSDN - BITMAPINFOHEADER (Windows CE 5.0): BI_ALPHABITFIELDS in biCompression member
- ↑ 가 나 다 MSDN Bitmap Header Types
- ↑ 가 나 다 MSDN BITMAPINFO Structure
- ↑ Feng Yuan - Windows graphics programming: Win32 GDI and DirectDraw: Packed Device-Independent Bitmap (CreateDIBPatternBrush, CreateDIBPatternBrushPt, FindResource, LoadResource, LockResource)
- ↑ Summers, Jason (2015년 10월 30일). “BMP Suite”. 2016년 7월 6일에 확인함.
- ↑ Summers, Jason (2015년 10월 30일). “pal8os2v2-16.bmp”. 2016년 7월 6일에 확인함.
- ↑ Cox, Chris (2010년 11월 15일). “Invalid BMP Format with Alpha channel”. 《Photoshop Windows forum》. Adobe. 2015년 1월 27일에 원본 문서에서 보존된 문서. 2016년 5월 22일에 확인함.
- ↑ “Microsoft Windows Bitmap: Summary from the Encyclopedia of Graphics File Formats”.
- ↑ 가 나 “JPEG and PNG Extensions for Specific Bitmap Functions and Structures”.
- ↑ MSDN – BITMAPV4HEADER: The member bV4AlphaMask
- ↑ MSDN – RGBQUAD: rgbReserved member
- ↑ see note under biClrUsed MSDN BITMAPINFOHEADER
- ↑ “Image Stride - Win32 apps”. 《learn.microsoft.com》.
- ↑ MSDN - BITMAPINFOHEADER: The member biBitCount
- ↑ “Types of Bitmaps”. MSDN. 2012년 6월 3일. 2014년 3월 16일에 확인함.
- ↑ MSDN: Windows CE - BITMAPINFOHEADER Structure
- ↑ 가 나 Adobe Photoshop: BMP Format 보관됨 2011-09-22 - 웨이백 머신
- ↑ 가 나 “Uncompressed RGB Video Subtypes”. 《dshow.h》. MSDN. 2014년 3월 11일에 확인함.
- ↑ “Image Formats”. 《FFmpeg General Documentation》. 2014. 2014년 2월 23일에 확인함.
- ↑ Julian Smart; Stefan Csomor; Kevin Hock (2006). 《Cross-Platform GUI Programming with Wxwidgets》. Prentice Hall. ISBN 0-13-147381-6.
- ↑ “Bitmap Image File (BMP), Version 5”. 《Digital Preservation》. 미국 의회도서관. 2014년 1월 8일. 2014년 3월 11일에 확인함.
외부 링크
[편집]- BMP - 텀즈