파일 형식
BMP란? 비트맵 형식 완벽 정리
BMP는 Windows의 무압축, 무손실 비트맵 형식입니다. 헤더 구조, 색 깊이, 한계, 그리고 파일을 작게 만드는 방법을 설명합니다.
작성자: Hemen Dönüştür Editör Ekibi게시일: 6분 분량

BMP는 Windows 세계에서 가장 오래되고 단순한 이미지 형식 중 하나입니다. BMP 파일은 보통 압축 없이 픽셀을 한 행씩 디스크에 기록합니다. 이 단순함 덕분에 읽기 쉽고 무손실이지만, 같은 이유로 파일이 엄청나게 커집니다. 이 글에서는 BMP가 어디서 왔는지, 파일 안에 무엇이 있는지, 색 깊이와 투명도의 세부 사항, 오늘날 어디서 여전히 BMP를 만나는지, BMP 파일을 더 실용적인 형식으로 변환하는 방법을 다룹니다.
BMP란 무엇인가요?
BMP(비트맵, 확장자 .bmp)는 픽셀 기반의 래스터 이미지 파일 형식입니다. 기술 문서에서는 장치 독립적 비트맵(DIB)이라고도 부릅니다. "장치 독립적"이라는 것은 이미지를 만든 그래픽 카드나 프린터와 관계없이 똑같이 해석할 수 있다는 뜻입니다. 파일은 색을 해석하는 데 필요한 정보를 자체 헤더와 색상표에 담고 있습니다.
Microsoft의 Win32 문서에 따르면 비트맵 파일은 BITMAPFILEHEADER 구조로 시작하고, 그 뒤에 BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADER 중 하나, 선택적인 색상표, 마지막으로 픽셀 데이터가 옵니다. MIME 유형은 image/bmp입니다.
간략한 역사: Windows와 OS/2에서 오늘날까지
BMP는 1980년대 후반 Microsoft와 IBM이 Windows와 OS/2를 공동 작업하면서 탄생했습니다. Windows 1.0 시절의 비트맵은 출력 장치에 크게 의존했으며, 장치 독립적인 형태는 1990년 Windows 3.0과 함께 널리 퍼졌습니다. OS/2 Presentation Manager용으로 정의된 12바이트 BITMAPCOREHEADER 때문에 지금도 "OS/2 BMP" 파일이라는 말이 쓰입니다.
형식은 수년에 걸쳐 헤더 끝에 필드를 추가하는 방식으로 확장되었습니다. 미국 의회도서관의 형식 설명에 따르면 버전 5는 1998년 Windows 98과 함께 등장해 ICC 색 프로필을 파일에 기록할 수 있게 했습니다. 오늘날 흔히 쓰이는 헤더 크기는 다음과 같습니다.
| 헤더 | 크기 | 주요 추가 사항 |
|---|---|---|
| BITMAPCOREHEADER | 12바이트 | OS/2 1.x와 호환되는 기본 구조 |
| BITMAPINFOHEADER | 40바이트 | Windows 3.0부터 쓰인 가장 흔한 헤더, 압축과 해상도 필드 |
| BITMAPV4HEADER | 108바이트 | 색상 마스크, 알파 마스크, 색 공간 정보 |
| BITMAPV5HEADER | 124바이트 | 내장 또는 연결된 ICC 프로필, 렌더링 의도 |
리더는 첫 필드의 크기 값으로 어떤 헤더가 쓰였는지 판별합니다. 덕분에 오래된 소프트웨어도 새 필드는 무시하고 기본 정보는 읽을 수 있습니다.
BMP 파일의 내부
파일 헤더와 "BM" 서명
모든 BMP 파일은 14바이트 파일 헤더로 시작하며, 첫 두 바이트는 ASCII 문자 BM(16진수 42 4D)입니다. 헤더에는 전체 파일 크기와 픽셀 데이터가 시작되는 바이트 오프셋이 저장됩니다. Windows 클립보드에 놓이는 DIB(CF_DIB 형식)는 이 14바이트를 생략하고 바로 정보 헤더로 시작합니다.
정보 헤더
정보 헤더에는 너비, 높이, 픽셀당 비트 수(biBitCount), 압축 유형, 가로와 세로 해상도(미터당 픽셀), 색상표에서 사용하는 색 수가 들어 있습니다.
색상표(팔레트)
픽셀당 8비트 이하의 이미지에서 픽셀은 색이 아니라 색상표의 인덱스입니다. Microsoft 문서의 예시에서 16색 32x32 비트맵의 픽셀 배열은 32 x 32 x 4 = 4096비트인데, 16색을 가리키는 데 4비트면 충분하기 때문입니다.
픽셀 데이터: 아래에서 위로 저장되는 행과 4바이트 정렬
BMP에는 특이한 점이 두 가지 있습니다. 첫째, 높이가 양수이면 행이 아래에서 위로 저장됩니다. 즉 파일의 첫 행이 그림의 맨 아래 행입니다. 높이가 음수이면 위에서 아래로 저장되지만, 그런 이미지는 압축할 수 없습니다. 둘째, 모든 행은 4바이트의 배수로 채워집니다. Microsoft는 행 길이(stride)를 다음과 같이 제시합니다.
stride = ((width * bitCount + 31) & ~31) >> 3
imageSize = |height| * stride
24비트 1920x1080 이미지라면 각 행은 1920 x 3 = 5,760바이트(이미 4의 배수)이므로 픽셀 데이터는 5,760 x 1,080 = 6,220,800바이트입니다. 54바이트 헤더를 더하면 파일은 약 6.2MB가 됩니다. 같은 그림을 JPG로 저장하면 대개 그 일부에 불과합니다.
색 깊이, 압축, 투명도
BITMAPV5HEADER 문서는 픽셀당 1, 4, 8, 16, 24, 32비트를 정의합니다(값 0은 색 깊이가 내장된 JPEG나 PNG 데이터에서 온다는 뜻). 1비트는 흑백, 4비트는 16색, 8비트는 256색 팔레트입니다. 24비트에서는 각 픽셀이 파랑, 초록, 빨강 순서의 3바이트입니다.
압축 필드는 다음 값을 가질 수 있습니다.
- BI_RGB: 무압축. 실제로는 BMP 파일의 대다수입니다.
- BI_RLE8과 BI_RLE4: 8비트와 4비트 팔레트 이미지용 단순 런 렝스 부호화. 넓고 평평한 영역에는 유용하지만 사진에는 거의 쓸모가 없습니다.
- BI_BITFIELDS: 압축이 아니라, 16비트와 32비트 픽셀에서 빨강, 초록, 파랑 비트의 위치를 마스크로 정의합니다(예: RGB 565).
- BI_JPEG과 BI_PNG: 비트맵 안에 JPEG나 PNG 데이터를 넣을 수 있게 합니다. 범용 뷰어에서는 거의 지원되지 않습니다.
투명도는 BMP에서 가장 일관성이 없는 부분입니다. V4와 V5 헤더의 알파 마스크로 32비트 픽셀의 네 번째 바이트를 불투명도로 정의할 수 있지만, 고전적인 32비트 BMP에서는 이 바이트가 사용하지 않는 것으로 설명되어 많은 프로그램이 무시합니다. 그래서 어떤 프로그램에서는 투명해 보이고 다른 프로그램에서는 검은 배경 위에 놓이는 32비트 BMP가 드물지 않습니다. 투명도가 필요하다면 PNG가 훨씬 안전합니다.
운영 체제, 브라우저, 소프트웨어 지원
BMP는 거의 어디서나 열립니다. Windows 기본 뷰어와 그림판, macOS 미리보기, 일반적인 Linux 뷰어 모두 BMP를 읽습니다. MDN의 이미지 형식 가이드는 Chrome, Edge, Firefox, Opera, Safari의 모든 버전에서 BMP를 지원한다고 나열합니다. 같은 가이드는 무압축 BMP 파일이 PNG나 JPG에 비해 매우 크므로 웹사이트 콘텐츠에는 대체로 피해야 한다고 강조합니다.
오늘날 BMP는 어디에 쓰이나요?
- Windows 애플리케이션 리소스와 구형 소프트웨어: 도구 모음 이미지, 설치 마법사 그래픽, 일부 게임 에셋은 여전히 BMP입니다.
- 임베디드 시스템과 마이크로컨트롤러: 화면이 있는 기기에 JPEG 디코더가 필요 없고, 픽셀 데이터를 바로 화면에 복사할 수 있습니다.
- 산업용 카메라, 스캐너, 테스트 도구: 가공하지 않은 무손실 출력이 필요할 때 BMP는 간단한 중간 형식입니다.
- 교육: 헤더가 수십 바이트에 불과해, 이미지 처리 수업에서 학생들이 처음 읽고 쓰는 형식인 경우가 많습니다.
장점과 단점
| 장점 | 단점 |
|---|---|
| 무손실, 픽셀 값이 절대 바뀌지 않음 | 무압축이라 파일이 매우 큼 |
| 읽고 쓰기가 아주 쉬워 CPU 부담이 없음 | 투명도 지원이 일관되지 않음 |
| 거의 모든 운영 체제와 브라우저에서 열림 | 메타데이터 지원이 약함(EXIF, 설명) |
| 팔레트 모드는 자원이 적은 기기에 적합 | 웹, 이메일, 업로드 양식에는 비실용적 |
자주 겪는 문제와 해결 방법
파일이 이메일이나 업로드 양식에 비해 너무 큽니다
가장 흔한 문제입니다. 사진과 스캔 이미지는 BMP를 JPG로 변환하면 대개 크기가 10분의 1 이하로 줄어듭니다. 스크린샷, 도표, 글자가 있는 이미지라면 BMP를 PNG로 변환하는 것이 낫습니다. PNG도 무손실이지만 압축되며, 날카로운 경계 주변에 JPG가 만드는 노이즈도 생기지 않습니다.
32비트 BMP가 검은 배경으로 보입니다
프로그램이 알파 바이트를 인식하지 못하거나 잘못 읽는 경우입니다. PNG로 변환하면 대개 해결됩니다. 투명도가 없는 JPG로 변환할 때는 투명 영역이 흰색이나 직접 고른 색으로 채워집니다.
이미지가 뒤집히거나 비스듬하게 보입니다
직접 만든 리더에서 이런 일이 생긴다면 대개 두 가지 실수 때문입니다. 행이 아래에서 위로 저장된다는 점을 무시했거나, 각 행 끝의 패딩 바이트를 건너뛰지 않은 것입니다. 위의 stride 공식을 쓰고 높이의 부호를 확인하면 둘 다 막을 수 있습니다.
프로그램이 BMP를 열지 못합니다
RLE 압축, BI_BITFIELDS, 내장 JPEG/PNG 데이터를 쓴 BMP 파일은 일부 단순한 리더가 지원하지 않습니다. 무압축 24비트 BMP로 다시 저장하거나 PNG로 변환하면 호환성 문제가 사라집니다.
변환 팁
- 사진은 JPG, 그래픽은 PNG: BMP에서 다른 형식으로 바꿀 때도 일반적인 원칙이 적용됩니다. 웹용이라면 이미지 변환기에서 WebP나 AVIF를 고를 수도 있습니다.
- 화질을 높게 유지하세요: BMP는 무손실이므로 JPG 화질 85~90%면 원본과 구별하기 어려운 결과를 얻을 수 있습니다.
- 필요하면 줄이세요: 파일이 여전히 크다면 픽셀 크기를 줄이거나 이미지 압축으로 목표 크기에 맞추세요.
- 반대 방향: 임베디드 기기나 구형 프로그램이 BMP를 요구한다면 이미지 변환기에서 대상 형식으로 BMP를 고르세요. 저희 도구는 표준 무압축 24비트 BMP를 만들며, 투명 영역은 선택한 배경색 위에 합쳐집니다.
저희 BMP 변환 페이지는 브라우저에서 실행됩니다. 파일은 업로드되지 않으며 기기를 떠나지 않습니다.
자주 묻는 질문
BMP와 DIB는 같은 것인가요?
실제로는 그렇습니다. DIB는 Windows가 메모리와 클립보드에서 쓰는 장치 독립적 비트맵 구조이고, BMP 파일은 그 구조 앞에 14바이트 파일 헤더를 붙인 것입니다.
BMP는 무손실인가요?
네. 무압축과 RLE 압축 BMP 파일은 픽셀 값을 정확히 유지합니다. 유일한 예외는 드물게 JPEG 데이터를 내장한 BMP입니다.
BMP를 PNG로 변환하면 화질이 떨어지나요?
아니요. PNG도 무손실이므로 이미지는 똑같이 유지되고, 압축 덕분에 크기만 작아집니다.
웹사이트에 BMP를 써도 되나요?
브라우저는 BMP를 표시하지만, 파일이 불필요하게 커서 페이지가 느려집니다. 웹에는 JPG, PNG, WebP, AVIF를 쓰세요.
BMP는 투명도를 지원하나요?
32비트 BMP는 이론상 알파 채널을 담을 수 있지만, 소프트웨어가 일관되게 지원하지 않습니다. 투명도가 필요할 때는 PNG가 더 안전합니다.


