一張 1920 × 1080 的 24 位元 BMP 接近 6 MB。同一張圖以品質 90 儲存為 JPEG,通常不到 500 KB。兩者相差近十倍,這正是 BMP 仍出現在老式掃描器、醫療軟體與 Windows 內部元件中,卻通常需要轉換後才能派上用場的原因。
BMP 的核心優勢就是簡單。要做好轉換,需要知道這種簡單性什麼時候是優勢,什麼時候是短板,以及哪個目標格式才真正適合當前工作。
BMP 為何仍然存在
BMP 用極小的標頭開銷儲存像素。沒有霍夫曼表、沒有 DEFLATE 狀態機、沒有色度子採樣。對於嵌入式系統、舊版 Windows 工具,以及「讀取標頭、複製位元組」即可搞定的場景,這種簡單性確實是優勢。
但同樣的缺點也將它擠出日常使用:
- 沒有有效壓縮。 未壓縮 BMP 體積龐大。RLE 變體存在,但鮮少能勝過現代編解碼器。
- 沒有可靠的 Alpha 通道。 32 位元 BMP 的 Alpha 位元組在不同工具間支援不一致。
- 由下而上的列順序。 大多數 BMP 從圖像底部向上儲存列,這對期望由上而下資料的處理流程會增加一個小轉換步驟。
- 沒有元資料生態。 傳統標頭不支援 EXIF、ICC 色彩描述檔,也沒有動畫。
用於歸檔或相容性,BMP 沒問題。用於網頁、郵件、行動裝置或追求儲存效率的情境,它就得換成別的格式。
選擇正確的輸出格式
在執行指令或寫程式之前,先確定你最看重什麼。
| 目標格式 | 適用場景 | 取捨 |
|---|---|---|
| JPG | 照片、預覽、任何螢幕展示 | 有損,但檔案極小 |
| PNG | 圖形、截圖、需要透明度的內容 | 無損,照片比 JPG 大 |
| WebP | 現代網頁、應用程式、任何在意頻寬的場景 | 比 JPG/PNG 更小,瀏覽器支援廣泛 |
如果你要轉換一份帶有文字與圖表的掃描文件,PNG 能保持邊緣銳利。如果轉換來自舊裝置的照片,JPG 或 WebP 更合適。用於網頁分發,WebP 通常在體積上勝出。
我們的瀏覽器端 BMP 轉 JPG、BMP 轉 PNG 與 BMP 轉 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
批次 shell 迴圈
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 轉 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 使用調色盤。如果沒有顯式轉換,某些解碼器傳回的是調色盤索引而非 RGB 值。在 Pillow 中,儲存為 JPEG 或 WebP 前使用
img.convert("RGB")可解決。 - 由下而上方向。 大多數程式庫會自動處理,但如果你手寫 BMP 解碼器,要記住正高度欄位表示列由下而上儲存。
- JPEG 預設品質。 許多工具預設 75–80。用於全螢幕觀看的照片,90 更安全;用於縮圖,70–80 足夠。
- WebP 相容性。 WebP 瀏覽器支援良好,但在某些舊版桌面圖片檢視器中仍可能無法開啟。如果目標是 Windows 原生應用程式,PNG 或 JPG 更安全。
不同場景該用什麼
- 遺留歸檔: 保留原始 BMP。儲存便宜,遺失原始版本不划算。
- 網頁上傳: 轉換為 WebP。如果需要備援格式,再保留一份 JPG。
- 印刷或編輯工作流: PNG 保持無損,避免壓縮偽影。
- 郵件與即時通訊: JPG 是最安全的通用格式。
如果你想快速轉換,又懶得安裝軟體、敲指令或上傳檔案,可以直接使用我們的 BMP 轉 JPG、BMP 轉 PNG 與 BMP 轉 WebP 轉換器。所有處理都在瀏覽器內完成,檔案自始至終留在你的機器上。



