mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-03-30 02:21:29

BMP(확장자)

그래픽 포맷
{{{#!wiki style="margin:0 -10px -5px; min-width:300px; min-height:calc(1.5em + 5px); word-break:keep-all"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px"
<colbgcolor=#f4eaa2,#7c732e>▶: 애니메이션 기능 지원 / L: 다중 레이어 지원 / α: 알파값 지원
비트맵 <colbgcolor=#f5f0cb,#555131> 손실 압축 JPEG AVIF▶Lα · BPG▶α · FLIF▶α · HEIF · WebP▶α · RAW · DDS▶Lα · PSD▶Lα
무손실
압축
APNG▶α · DNG · EXRα · GIF · PCX · PNGα · RGBEα · TGAα · TIFF
무손실 무압축 BMPα
벡터 AI · CDR · SVG
관련 틀: 그래픽 · 오디오 · 비디오
}}}}}}}}}


1. 개요2. 분류3. 사용처4. 무압축5. 용량 제한6. 헤더의 구조7. 용량 계산법8. 비트 할당법9. 기타

1. 개요

비트맵 디지털 그림을 저장하는 데 쓰이는 그림 파일 포맷이다.

2. 분류

줄여서 비트맵, 또 장치 독립 비트맵의 경우 DIB(Device-independent Bitmap), 장치 종속적인 경우는 DDB(Device-dependent Bitmap)라고 한다.

3. 사용처

특히 Microsoft Windows, OS/2 환경에서 널리 쓰인다.

수많은 그래픽 사용자 인터페이스는 자체 내장 그래픽 하부 시스템에서 비트맵을 사용한다. 이를테면, 마이크로소프트 윈도와 OS/2 플랫폼의 GDI 하부 시스템은 .BMP, .DIB의 파일 확장자 이름을 가진다. 기본적으로 1~24비트의 색을 표현할 수 있으며, 알파 채널을 포함한 32비트 포맷이 GDI+가 도입된 Windows XP에서 발표되었다.[1]

4. 무압축

BMP 컨테이너는 무압축부터 RLE, JPEG, PNG로 압축된 비트스트림을 지원하지만 대부분의 프로그램들은 파일압축을 전혀 하지 않아 파일 크기가 크다. Internet Explorer를 제외한 웹 브라우저에서는 이미지로 인식하지 않는 경우가 많아서 뭣도 모르는 인터넷 초보자들이 이 형식으로 게시판에 그림을 올렸다가 낭패 보는 경우가 대부분이다.[2] 이 때문에 인터넷 상에서는 거의 버려지다시피하는 형식이다. 하지만 사실상 압축을 하지 않는다는 특징 때문에 RAW 방면에서는 어느정도 사용되고 있다.

한편 압축하지 않는다는 점이 오히려 이미지의 처리 속도에 도움이 되기도 한다. 압축이 된 이미지 형식의 경우 그 이미지를 표시하기 위해 압축을 풀려면 시간과 CPU의 성능이 더 필요해지기 때문. 압축 푸는 과정이 없어서 파일 읽는 시간이 짧으면서 CPU 성능 점유율이 낮다는 장점 덕분에 간간이 2D게임에도 쓰이곤 한다. 주로 '스프라이트'라고 불리는 파일 하나에 여러 모션이 들어있는 방식으로 쓰이는 편. 3D 그래픽의 텍스처 포맷으로 사용되기도 하지만, 이미 1990년대 말부터 GPU에서 바로 사용이 가능한 텍스처 압축 전용 포맷(DXTC 등)들이 표준화되기 시작하였기 때문에 생각보다 사용 빈도는 낮았다. 물론 해당 텍스처 압축 포맷들은 손실 압축 포맷이라 도트류의 그림이나 UI와의 상성이 별로라 이쪽에서는 사용되기도 했지만. 2000년대 초중반 미니게임류의 인디 게임들[3]을 보면 스프라이트 데이터로 BMP를 사용한 경우가 꽤 되었다. 그 덕분에 편집 접근성이 매우 쉬워서 유저들이 스프라이트를 편집해서 스킨변경한 버전들 또한 자주 돌아다녔다. 사운드 이펙트의 경우에도 로딩속도가 빠르기 때문에 WAV를 사용한 경우가 많았다.

일반적으로 데이터를 압축하지 않고 사용되지만, RLE 압축 방식도 지원한다. 간단하게 말하면 그림판 파일. 다만 Windows7 이후부터는 그림판도 PNG를 기본 확장자로 사용한다.

5. 용량 제한

WAV처럼 BMP 파일 1개의 크기가 4 GiB(4,294,967,296 바이트) 이상이 되도록 저장할 수 없다. 후술할 파일 헤더에서 자체 파일 크기를 적을 수 있는 길이가 4바이트밖에 되지 않기 때문이다.[4]

6. 헤더의 구조

BMP 파일을 16진수 편집기를 통해 까보면 어떤 정체를 알 수 없는 숫자들이 맨 처음에 나열되어 있는데, 잘 보면 어떤 파일이든 처음 몇몇 숫자들의 구조는 같다는 공통점이 있다. 이를 헤더라고 한다.

비트맵 파일 헤더 (BITMAPFILEHEADER)
시작 위치 크기 설 명
0 2 BMP 파일임을 식별할 때 사용되는 매직 넘버.
Hex 에디터로 확인 해 보면 'B' (0x42) 'M' (0x4D) 을 확인할 수 있다.
2 4 모든 헤더를 포함한 BMP 파일의 전체 크기. 리틀 엔디언으로 표기되어 있다. Hex 에디터에서 1E 27 00 00 로 나온다면 10,014Byte
6 2 예약된 값. 실제 사용하지 않지만 응용 프로그램에 따라 다른 값이 저장될 수 있다.
8 2
10 4 비트맵 데이터(Payload)가 시작되는 위치 (Offset)

비트맵 정보 헤더 (BITMAPV5HEADER)
시작 위치 크기 설 명 버전
14 4 이 헤더의 크기. 비트맵 버전에 따라 다르다.
가장 오래된 버전인 Core는 12바이트지만, 최신 버전인 V5는 124바이트 인 식.
BITMAPCORE
18 4 비트맵 너비 (부호 있는 정수형).[5] Core 에서는 부호 없는 2바이트 BITMAPCORE
22 4 비트맵 높이 (부호 있는 정수형).[6] Core 에서는 부호 없는 2바이트 BITMAPCORE
26 2 사용하는 색상 플레인의 수. BMP는 Planar 형식을 사용하지 않으므로 1 로 고정 BITMAPCORE
28 2 한 화소당 비트의 수. 4, 8 일 경우 색상 테이블이 있는지 확인해야 한다.
16, 24, 32 일 경우 거의 모든 색상을 사용할 수 있기 때문에 일반적으로 색상 테이블이 사용되지 않는다
BITMAPCORE
30 4 압축 방식. 흔히 접할 수 있는 BMP 의 경우 0 이 대부분이다.
0 = RGB, 1 = RLE8, 2 = RLE4, 3 = BITFIELDS, 4= JPEG, 5 = PNG
BITMAPINFO
34 4 화소 데이터(Payloads)의 총 크기. 파일의 총 크기가 아니다! BITMAPINFO
38 4 이미지의 가로 해상도 (미터당 화소, 부호 있는 정수형). BITMAPINFO
42 4 이미지의 세로 해상도 (미터당 화소, 부호 있는 정수형). BITMAPINFO
46 4 사용한 색상 수 BITMAPINFO
50 4 중요한 색상 수. 0은 모든 색상이 중요함을 의미한다.[7] BITMAPINFO
54 4 적색 컬러마스크 BITFIELD 압축시에만 사용. 그 외는 0 BITMAPV4
58 4 녹색 컬러마스크 BITFIELD 압축시에만 사용. 그 외는 0 BITMAPV4
62 4 청색 컬러마스크 BITFIELD 압축시에만 사용. 그 외는 0 BITMAPV4
66 4 알파 컬러마스크 BITFIELD 압축시에만 사용. 그 외는 0 BITMAPV4
70 4 컬러 매니지먼트.
0 = 파일에 설정된 프로파일 사용. 'sRGB' = sRGB, 'Win ' = Windows 기본, 'LINK' = 외부 컬러 프로파일을 사용. 'MBED' 파일에 내장된 컬러 프로파일 사용.
BITMAPV4
74 36 색역 엔드포인트. CIE XYZ로 색역을 지정. 바로 위의 색 영역 값이 0이 아니면 무시된다. BITMAPV4
110 4 적색 감마 (톤커브) BITMAPV4
114 4 녹색 감마 (톤커브) BITMAPV4
118 4 청색 감마 (톤커브) BITMAPV4
122 4 컬러 매니지먼트 정책. 1 = Saturation, 2 = Relative, 4 = Perceptual, 8 = Absolute BITMAPV5
126 4 임베디드된 컬러 프로파일의 위치(오프셋)'MBED' 또는 경로'LINK'. 색상 관리값이 LINK또는 MBED 일때만 유효. BITMAPV5
130 4 임베디드된 컬러 프로파일의 크기. 색상 관리값이 LINK또는 MBED 일때만 유효. BITMAPV5
134 4 예약됨. 항상 0 BITMAPV5

7. 용량 계산법

비압축 포맷이기 때문에, 굳이 알 필요는 없지만 용량 계산이 꽤나 간단하다. 일단 계산 공식은

[math(whb \times 1024^{-n})]

예를 들어보자. 640x480 크기의 24비트 비트맵 이미지가 있다. 이 이미지의 용량은 640px * 480px * 24bits / 8 = 92만 1600 바이트 = 900 kB로 계산할 수 있다.

또한, 계산 공식에서 알 수 있듯이 용량은 사용 비트 수(쉽게 말해서 색 품질)에 비례하므로 16비트 이미지는 같은 사이즈의 24비트 이미지의 3분의 2, 256색 이미지는 3분의 1의 용량을 차지한다.

다만 실제로 비트맵 파일을 만들어서 비교해 보면 약간의 오차가 있다. 이는 실제 비트맵 파일에는 헤더 등 다른 정보도 추가되기 때문이다. 특히 8비트 인덱스 컬러 포맷이라면 데이터 영역 앞에 색상 테이블이 추가되기 때문에 용량 차이가 더 날 수 있다.

8. 비트 할당법

8비트까지는 그래픽 툴에서 특정 색을 직접 지정하거나 운영 체제에서 정한 "팔레트[8]"를 사용하는데, 이를 인덱스 컬러(Indexed Color)라고 한다. 그러다가 16비트 이상의 이미지부터 비트를 적당히 3등분(?)하여 사용하게 된다.

9. 기타


[1] 한글과컴퓨터 한컴오피스 2007 이상 버전이 이 형식을 사용해서 프로그램 로고를 출력한다. 그 이전까지는 24비트 BMP 사용. [2] 웹 브라우저는 원래 범용적으로 GIF, JPG, PNG 이외의 파일은 잘 지원하지 않는다. 근래에 추가된 것도 WebP, AVIF 같은 압축 포맷이다. IE는 제작사가 마이크로소프트이기 때문에 지원하는 것. [3] 프론트라인, 키루비루 등. [4] 4바이트 모두 FF로 채우면 0xFFFFFFFF이 되는데, 십진수로 나타내면 4,294,967,295가 된다. [5] 양수의 경우 픽셀이 x+ 방향으로 저장되고 음수의 경우 x- 방향으로 저장된다. [6] 양수의 경우 스캔라인이 y+ 방향으로 음수의 경우 y- 방향으로 이동한다. [7] 이는 256색 비트맵을 16색 지원 장치에서 표시하는 상황 등 모든 색을 사용할수 없을 때 사용할 색상 수를 나타낼때 사용되었다. [8] Palette. 물감 짜놓고 쓰는 그 팔레트의 개념 맞다. [9] BMP에서 32비트는 잘 사용하지 않는 규격이다. [10] 컴퓨터 메모리의 구성처럼 4분면 좌표평면을 사용하지 않고 사람에게 익숙한 1분면 좌표평면을 사용하는데 이는 IBM OS/2를 개발하면서 BMP의 원형인 DIB를 개발하였는데 좌표계를 통일시키며 생긴 특징이다.