1920 × 1080 해상도의 24비트 BMP는 약 6MB다. 동일한 이미지를 품질 90의 JPEG로 저장하면 보통 500KB가 채 되지 않는다. 거의 열 배에 달하는 이 크기 차이 때문에 BMP는 여전히 오래된 스캐너, 의료 소프트웨어, Windows 내부 구성 요소에 남아 있고, 다른 곳에서 쓰려면 거의 항상 변환이 필요하다.
BMP의 강점은 단순함에 있다. 변환을 잘하려면 그 단순함이 언제 유리하고 언제 불리하며, 어떤 대상 형식이 실제 작업에 맞는지 아는 것이 중요하다.
BMP가 여전히 쓰이는 이유
BMP는 헤더 오버헤드를 최소화한 채 픽셀을 저장한다. 허프만 테이블도, DEFLATE 상태 머신도, 색도 서브샘플링도 없다. 임베디드 시스템이나 레거시 Windows 도구, "헤더를 읽고 바이트를 복사하면 끝"인 상황에서는 이런 단순함이 확실한 장점이다.
반면 일상에서 밀려난 것도 같은 한계 때문이다.
- 효과적인 압축이 없다. 압축되지 않은 BMP는 크다. RLE 변형이 있지만 현대 코덱을 이기는 경우는 드물다.
- 신뢰할 수 있는 알파 채널이 없다. 32비트 BMP의 알파 바이트는 도구마다 지원이 일관되지 않다.
- 아래에서 위로(bottom-up)인 행 순서. 대부분의 BMP는 이미지 아래쪽부터 위쪽으로 행을 저장한다. 위에서 아래(top-down)를 기대하는 처리에는 작은 변환 단계가 추가된다.
- 메타데이터 생태계가 없다. 고전 헤더는 EXIF, ICC 프로파일을 지원하지 않으며 애니메이션도 없다.
보관이나 호환성을 위해서라면 BMP도 괜찮다. 웹, 이메일, 모바일, 저장 효율성을 중시한다면 다른 형식으로 바꿔야 한다.
올바른 출력 형식 선택
명령을 실행하거나 코드를 작성하기 전에 무엇을 최적화할지 결정한다.
| 대상 형식 | 사용 상황 | 트레이드오프 |
|---|---|---|
| JPG | 사진, 미리보기, 모든 화면 표시 | 손실 압축이지만 파일 크기가 매우 작다 |
| PNG | 그래픽, 스크린샷, 투명도가 필요한 콘텐츠 | 무손실이지만 사진은 JPG보다 크다 |
| WebP | 현대 웹, 앱, 대역폭이 중요한 상황 | JPG/PNG보다 작고 브라우저 지원도 넓다 |
문자와 도표가 포함된 스캔 문서를 변환한다면 PNG가 가장자리를 선명하게 유지한다. 오래된 기기에서 나온 사진이라면 JPG나 WebP가 더 적합하다. 웹 배포라면 보통 WebP가 크기에서 우위를 점한다.
브라우저에서 동작하는 BMP to JPG, BMP to PNG, BMP to WebP 변환기로 세 가지 경우 모두 로컬에서 처리할 수 있다. 파일은 브라우저 안에서만 다뤄진다.
Windows에서 변환
그림판
- 그림판에서 BMP를 연다.
- 파일 > 다른 이름으로 저장을 선택한다.
- JPEG 그림, PNG 그림, 또는 WebP 이미지를 선택한다.
- 저장한다.
그림판은 한 번에 한 장의 파일 처리에 적합하다. 품질 조절이나 배치 옵션이 없어서 폴더 전체 이미지에는 부적합하다.
PowerShell(ImageMagick)
공식 설치 프로그램으로 ImageMagick을 설치한 후:
magick input.bmp output.jpg
magick input.bmp output.png
magick input.bmp output.webp
폴더 내 일괄 변환:
Get-ChildItem *.bmp | ForEach-Object {
magick $_.FullName ($_.BaseName + ".jpg")
}
외부 도구 없는 PowerShell
Windows 10과 11에는 .NET 이미징 스택이 내장되어 있다. 이 방식은 BMP에서 JPG/PNG로 변환할 수 있지만 WebP는 추가 라이브러리가 필요하다.
Add-Type -AssemblyName System.Drawing
$img = [System.Drawing.Image]::FromFile("input.bmp")
$img.Save("output.jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg)
$img.Dispose()
macOS에서 변환
미리보기
- 미리보기에서 BMP를 연다.
- 파일 > 내보내기를 선택한다.
- 형식 드롭다운에서 대상 형식을 선택한다.
- JPEG의 경우 필요에 따라 품질을 조절한다.
미리보기는 빠르고 오프라인에서도 작동하지만, 그림판과 마찬가지로 한 파일씩만 처리할 수 있다.
터미널에서 sips 사용
sips는 macOS에 기본 내장되어 있으며 BMP, JPEG, PNG, TIFF를 지원한다.
sips -s format jpeg input.bmp --out output.jpg
sips -s format png input.bmp --out output.png
WebP는 ImageMagick이나 Homebrew의 webp 패키지에 포함된 cwebp가 필요하다.
brew install webp
# cwebp는 BMP를 직접 읽지 못하므로 먼저 PNG로 변환
sips -s format png input.bmp --out temp.png
cwebp temp.png -o output.webp
rm temp.png
배치 셸 루프
for f in *.bmp; do
sips -s format jpeg "$f" --out "${f%.bmp}.jpg"
done
Linux에서 변환
ImageMagick
sudo apt install imagemagick
magick input.bmp output.jpg
magick input.bmp output.png
magick input.bmp output.webp
JPEG 품질 조절:
magick input.bmp -quality 90 output.jpg
배치 변환
for f in *.bmp; do
magick "$f" "${f%.bmp}.jpg"
done
가장 작은 WebP 출력만 필요하다면 cwebp를 직접 사용한다.
for f in *.bmp; do
cwebp -q 85 "$f" -o "${f%.bmp}.webp"
done
코드로 변환하기
애플리케이션, 파이프라인, 백엔드 서비스 안에서 변환이 필요하다면 ImageMagick을 호출하는 것보다 라이브러리를 호출하는 편이 깔끔하다.
TypeScript / Node.js
sharp를 사용한다. BMP 입력을 받아 JPG, PNG, WebP를 출력할 수 있다.
import sharp from "sharp"
async function convertBmp(
input: string,
output: string,
format: "jpg" | "png" | "webp"
) {
await sharp(input)
.toFormat(format, format === "jpg" ? { quality: 90 } : undefined)
.toFile(output)
}
await convertBmp("input.bmp", "output.jpg", "jpg")
await convertBmp("input.bmp", "output.png", "png")
await convertBmp("input.bmp", "output.webp", "webp")
브라우저에서는 sharp를 실행할 수 없다. 우리의 BMP to WebP 변환기는 WebAssembly를 사용해 클라이언트 측에서 디코딩과 인코딩을 모두 처리한다.
PHP
GD 확장이 활성화되어 있다면 PHP에 내장된 이미지 함수를 사용할 수 있다.
<?php
function bmpToJpg(string $input, string $output, int $quality = 90): void {
$image = imagecreatefrombmp($input);
imagejpeg($image, $output, $quality);
imagedestroy($image);
}
function bmpToPng(string $input, string $output): void {
$image = imagecreatefrombmp($input);
imagepng($image, $output);
imagedestroy($image);
}
function bmpToWebp(string $input, string $output, int $quality = 90): void {
$image = imagecreatefrombmp($input);
imagewebp($image, $output, $quality);
imagedestroy($image);
}
bmpToJpg("input.bmp", "output.jpg");
bmpToPng("input.bmp", "output.png");
bmpToWebp("input.bmp", "output.webp");
Go
Go 표준 라이브러리는 BMP를 읽지 않지만 golang.org/x/image/bmp로 읽을 수 있다. 출력은 image/jpeg, image/png, golang.org/x/image/webp를 사용한다.
package main
import (
"image/jpeg"
"image/png"
"os"
"golang.org/x/image/bmp"
"golang.org/x/image/webp"
)
func bmpToJpg(input, output string, quality int) error {
f, err := os.Open(input)
if err != nil {
return err
}
defer f.Close()
img, err := bmp.Decode(f)
if err != nil {
return err
}
out, err := os.Create(output)
if err != nil {
return err
}
defer out.Close()
return jpeg.Encode(out, img, &jpeg.Options{Quality: quality})
}
PNG와 WebP도 동일한 패턴으로 png.Encode와 webp.Encode를 사용하면 된다.
Java
Java의 ImageIO는 BMP 읽기를 기본 지원한다. WebP 출력은 webp-imageio나 cwebp 바인딩 같은 라이브러리가 필요하다.
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class BmpConverter {
public static void bmpToJpg(String input, String output, float quality) throws IOException {
BufferedImage image = ImageIO.read(new File(input));
File out = new File(output);
ImageIO.write(image, "jpg", out);
}
public static void bmpToPng(String input, String output) throws IOException {
BufferedImage image = ImageIO.read(new File(input));
File out = new File(output);
ImageIO.write(image, "png", out);
}
}
JPEG 품질을 세밀하게 제어하려면 JPEGImageWriteParam API를 사용한다.
Python
Pillow가 있다면 Python은 BMP를 주요 형식으로 변환하기 가장 간단한 방법이다.
from PIL import Image
with Image.open("input.bmp") as img:
img.convert("RGB").save("output.jpg", quality=90)
with Image.open("input.bmp") as img:
img.save("output.png")
with Image.open("input.bmp") as img:
img.save("output.webp", quality=90)
투명도를 유지하여 PNG로 출력하려면 RGB 강제 변환을 하지 않는다.
with Image.open("input.bmp") as img:
img.save("output.png")
흔한 함정
- 인덱스 컬러 BMP. 8비트 이하 BMP는 팔레트를 사용한다. 명시적으로 변환하지 않으면 일부 디코더가 팔레트 인덱스를 반환한다. Pillow에서는 JPEG나 WebP 저장 전에
img.convert("RGB")를 호출한다. - 아래에서 위 방향. 대부분의 라이브러리가 자동 처리하지만 직접 BMP 디코더를 작성할 때는 높이 필드가 양수면 행이 아래에서 위로 저장된다는 점을 기억한다.
- JPEG 기본 품질. 많은 도구가 75–80을 기본값으로 한다. 전체 화면으로 볼 사진이라면 90이 안전하다. 썸네일이라면 70–80로 충분하다.
- WebP 호환성. WebP는 브라우저 지원이 넓지만 일부 오래된 데스크톱 이미지 뷰어에서는 열리지 않는다. 대상이 Windows 네이티브 앱이라면 PNG나 JPG가 더 안전하다.
상황별 선택
- 레거시 보관: 원본 BMP를 그대로 둔다. 스토리지는 저렴하고 원본을 잃는 쪽이 더 큰 손해다.
- 웹 업로드: WebP로 변환한다. 대안이 필요하면 JPG도 함께 보관한다.
- 인쇄나 편집 워크플로: PNG는 무손실이며 압축 아티팩트가 없다.
- 이메일과 메신저: JPG가 가장 안전한 범용 형식이다.
설치나 명령줄 없이 빠르게 변환하고 싶다면 BMP to JPG, BMP to PNG, BMP to WebP 변환기를 사용한다. 모든 처리가 브라우저 안에서 이루어지므로 파일은 처음부터 끝까지 사용자의 기기에 남는다.



