BMP 포맷 — 윈도우 비트맵 파일의 구조와 쓰임
윈도우 기본 비트맵 포맷 BMP의 파일 구조(파일 헤더·정보 헤더·색상표·픽셀 배열), 거의 압축하지 않아 용량이 큰 이유, 아래에서 위로 저장하는 방식과 행 채움 규칙, 지금도 BMP가 필요한 경우를 정리했습니다.
BMP는 마이크로소프트 윈도우와 OS/2에서 쓰이던 장치 독립 비트맵(DIB) 을 파일로 저장하는 형식입니다. 국제 표준 기구가 정한 규격이 아니라 마이크로소프트의 개발 문서가 사실상의 명세 역할을 합니다. 구조가 단순해 어떤 프로그램이든 쉽게 읽고 쓸 수 있다는 점이 가장 큰 특징입니다.
파일 구조
Microsoft Learn의 "Bitmap Storage" 문서에 따르면 BMP 파일은 다음 순서로 구성됩니다.
| 순서 | 구성 요소 | 내용 |
|---|---|---|
| 1 | BITMAPFILEHEADER | 파일 식별자(BM), 파일 크기, 픽셀 데이터 시작 위치 |
| 2 | BITMAPINFOHEADER(또는 V4·V5 헤더) | 가로·세로 픽셀, 픽셀당 비트 수, 압축 방식, 해상도 |
| 3 | 색상표(RGBQUAD 배열) | 팔레트를 쓰는 1·4·8비트 이미지에서 사용 |
| 4 | 픽셀 배열 | 실제 이미지 데이터 |
파일 첫 두 바이트가 ASCII BM(16진수 42 4D)이므로, 확장자가 바뀐 파일도 이 서명으로 BMP인지 확인할 수 있습니다. 정보 헤더에는 인쇄용 해상도(미터당 픽셀 수)를 적는 칸도 있습니다.
아래에서 위로 저장한다
일반적인 BMP는 아래쪽 행부터 위쪽 행 순서로(bottom-up) 픽셀을 저장합니다. 헤더의 높이 값이 음수이면 위에서 아래로(top-down) 저장한 것입니다. 또 각 행의 바이트 수는 4의 배수가 되도록 끝에 채움 바이트를 넣습니다. 직접 BMP를 해석하는 프로그램을 만들 때 자주 실수하는 부분입니다.
행 크기 계산 예
BMP의 한 행은 4바이트 단위로 맞춰야 합니다. 24비트 이미지의 가로가 101픽셀이면 한 행의 실제 데이터는 101 × 3 = 303바이트인데, 4의 배수가 되도록 1바이트를 채워 304바이트로 저장합니다. 따라서 픽셀 데이터 전체 크기는 (행 바이트 수) × 세로 픽셀이며, 여기에 헤더(보통 54바이트)를 더하면 파일 크기가 됩니다. 이 규칙 때문에 가로가 4의 배수가 아닌 이미지를 직접 다룰 때 한 줄씩 밀려 보이는 오류가 자주 생깁니다.
용량이 큰 이유
BMP는 대부분 압축하지 않은 원시 픽셀을 그대로 저장합니다. 24비트 BMP는 픽셀당 3바이트이므로, 1920×1080 이미지는 약 6.2MB, 4032×3024 스마트폰 사진은 약 36.6MB가 됩니다. 8비트 이하 팔레트 이미지에는 RLE(연속 길이 부호화) 압축을 선택할 수 있지만 사진에는 효과가 거의 없습니다. MDN도 용량 때문에 웹 콘텐츠에는 BMP를 피하라고 권합니다.
투명도
전통적인 24비트 BMP에는 알파 채널이 없습니다. V4·V5 헤더를 쓰는 32비트 BMP는 알파 마스크를 정의할 수 있지만, 이를 투명도로 제대로 해석하지 않는 프로그램이 많아 투명 이미지 교환용으로는 PNG가 안전합니다.
지금도 BMP를 쓰는 경우
- 오래된 산업용 장비, 임베디드 기기, 영수증 프린터, 일부 사내 프로그램이 BMP만 받는 경우
- 압축·복원 과정 없이 픽셀을 그대로 다뤄야 하는 간단한 프로그램이나 학습용 예제
- 윈도우 아이콘(ICO) 내부의 작은 이미지 저장 방식
변환할 때 주의점
- BMP → PNG: 무손실이면서 용량이 크게 줄어듭니다. 보관·공유용으로 가장 좋은 변환입니다.
- BMP → JPG: 사진이라면 용량이 수십 분의 1로 줄지만 손실 압축이 적용됩니다.
- 다른 포맷 → BMP: 장비가 요구하는 비트 수(24비트 또는 8비트)를 확인하세요. 투명 영역은 배경색으로 채워집니다. 이미지 포맷 변환 도구에서 BMP로 저장할 수 있습니다.