深度解析

如何將 BMP 轉換為 JPG、PNG 與 WebP:實用指南

koboshiCo-founder
·4 分鐘閱讀
如何將 BMP 轉換為 JPG、PNG 與 WebP:實用指南
概述

BMP 容易讀取但佔用空間巨大。本指南涵蓋本機作業系統工具、命令列工作流程,以及五種語言的程式碼轉換,幫你把 BMP 有效率地轉成 JPG、PNG 或 WebP。

一張 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 轉 JPGBMP 轉 PNGBMP 轉 WebP 轉換器可以本機處理這三種情況——檔案不會離開你的裝置。

在 Windows 上轉換

小畫家

  1. 用小畫家開啟 BMP。
  2. 選擇檔案 > 另存新檔
  3. 選擇 JPEG 圖片PNG 圖片WebP 影像
  4. 儲存。

小畫家只能應付單張圖片。沒有品質調節,也支援不了批次處理,所以不適合整個資料夾的圖片。

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 上轉換

預覽

  1. 用預覽開啟 BMP。
  2. 選擇檔案 > 輸出
  3. 從格式下拉選單中選擇目標格式。
  4. 如需輸出 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/jpegimage/pnggolang.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.Encodewebp.Encode

Java

Java 的 ImageIO 原生支援讀取 BMP。輸出 WebP 需要額外程式庫,例如 webp-imageiocwebp 繫結。

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 轉 JPGBMP 轉 PNGBMP 轉 WebP 轉換器。所有處理都在瀏覽器內完成,檔案自始至終留在你的機器上。

更多推薦閱讀